Before we can run our program on a computer, a compiler translates our human-readable code into machine language - a long string of 0s and 1s. When the code is being compiled, the compiler looks for syntax errors in the code - you can think of it like proofreading.
For example, if the compiler comes across a mispelled word or misused function in your code, it will throw a compile-time error and your code will not even be translated into machine language. Imagine you write 'fro' instead of 'for' or you try to apply the length() function to an integer. These are things that the compiler does not know how to read and therefore it will throw an error.
Runtime errors are different, they are caused after your code has been compiled and is running, by wrong logic or wrong input of data such as division by 0. For example, if you have the following code:
int i = 17;
int[] a = new int[5];
a[i] = 20;
this will give you a runtime error because you are trying to access an element of the array that is out of bounds.