class 123ABC{
}
错误原因:编译器检测到class这个单词,那么编译器会从class这个单词后面找类名,而类名是标识符,编译器找了半天没有找到标识符,因为123ABC不是标识符,所以编译器提示的错误信息是:需要<标识符>
解决办法:将123ABC修改为合法的标识符。
class Hello World{
}
错误原因:编译器检测到class这个单词,然后找class后面的标识符,编译器找到了一个合法的标识符叫做“Hello”,然后编译器继续往后找“{”,结果没有找到“{”,所以报错了。
解决办法:①把World删除;②把空格删除。
public static void main(String[] args){
int age;
System.out.println(age);
}
错误原因:在访问变量age前没有赋初值。
解决办法:在访问变量age前为其赋初值。
public static void main(String[] args){
System.out.println(k);
int k = 1;
}
错误原因:在访问变量之前没有声明赋值,因为方法体中的语句严格按照自上而下的顺序执行的,不可能自下而上执行。
解决办法:把声明赋值变量的语句写到访问该变量的语句之前。
public static void main(String[] args){
int a = name;
}
错误原因:编译器会认为name是一个变量,name从未声明并赋值过。
解决办法:对name声明并赋值。
public static void main(String[] args){
int a;
int a;
}
public static void main(String[] args){
int a = 10;
double a = 3.14;
}
错误原因:变量在同一个域当中不能重复声明、不能重名。
解决办法:变量只需声明一次即可,声明其他类型变量时不要与之前已声明的变量重名。
public static void main(String[] args){
int a = "hello";
}
错误原因:等号前后的数据类型不匹配。
解决办法:①类型修改为String;②数据修改为整型数据。
public static void main(String[] args){
char c2 = 'ab';
}
错误原因:编译器检测到了左半段单引号,然后找左半段单引号后面的字符,编译器找到了一个字符a,然后编译器继续往后找右半段单引号,结果没有找到右半段单引号,所以报错未结束的字符文字,因为右半段单引号表示一个字符的结束。
解决办法:char类型的字面量只能是单引号括起来的单个字符。
public static void main(String[] args){
byte b1 = 128;
System.out.println(b1);
short s1 = 32768;
System.out.println(s1);
char c2 = 65536;
System.out.println(c2);
}
错误原因:当一个整数超出byte short char的取值范围的时候,这个整数不可直接赋值给byte short char类型的变量。
解决办法:强制类型转换,但执行时可能会有精度损失。
public static void main(String[] args){
long l = 2147483648;
System.out.println(l);
}
错误原因:2147483648是int类型的字面量,但超出了int的表示范围,所以在没有赋值之前就出错了。
解决办法:int型字面量后加L变成long型字面量。
public static void main(String[] args){
System.out.println(true & 10);
}
错误原因:逻辑运算符两边的数据类型必须是boolean,不能是其他数据类型。
解决办法:两边数据类型都改为boolean类型即可。
public static void main(String[] args){
int a = 10;
int b = 20;
char c = a > b ? 'x' : "y";
System.out.println(c);
}
错误原因:三目运算符中冒号左右表达式1和表达式2的数据类型不一致。
解决办法:表达式2数据类型改为字符型。
public static void main(String[] args){
boolean sex = true;
if(sex)
System.out.println("男");
System.out.println("Hello World");
else
System.out.println("女");
}
错误原因:错误提示出现在else所在的那一行,因为else缺少if,所以报错。
解决办法:养成加括号的习惯。
public static int m(){
boolean flag = true;
if(flag){
return 1;
}
}
错误原因:编译器不负责运行程序,编译器只讲道理。对于编译器来说,编译器只知道flag变量是boolean类型,编译器会认为flag有可能是false,有可能是true。编译器觉得:if语句可能会执行,当然也可能不会执行。编译器为了确保程序不出现任何异常,所以编译器说:缺少返回语句
解决办法:换成以下写法
public static int m(){
boolean flag = true;
if(flag){
return 1;
}else{
return 0;
}
}
public static int m(){
boolean flag = true;
if(flag){
return 1;
}
return 0;
}
原因:没有创建对象就去用类名.访问实例变量。
解决:实例变量应该先创建对象,用对象.的方式去访问。
public class Student{
String no;
String name;
int age;
public static Student(){
}
}
原因:构造方法的修饰符列表中加了static
解决:static去掉。
public class Student{
String no;
String name;
int age;
public student(){
}
}
原因:编译器检测到方法名和类名不相同,会认为该方法是一个普通方法,又进一步检测到该普通方法无返回值类型,所以报错。
解决:构造方法名应该和类名相同且无返回值类型,普通方法有返回值类型。
原因:如果只写了有参构造方法,无参构造方法没有写,那么系统不再提供无参构造方法。所以在创建对象的时候调用无参构造方法编译会报错。
解决:最好任何时候都将无参构造方法写出来。
原因:在构造方法体中,this();语句前面写了其他语句;
解决:this() 这种语法只能出现在构造方法第一行,表示当前构造方法调用本类其他的构造方法,目的是代码复用。
class Animal{
String name;
public void move(){
System.out.println("动物在移动!");
}
}
class Cat extends Animal{
protected void move(){
System.out.println("猫在走猫步!");
}
}
原因:在具有继承关系的两个类中,子类要覆盖父类中的方法的时候,子类中该方法的访问权限不可以比父类中该方法的访问权限更低。
解决:子类中的方法访问权限应高于或等于父类。
class Animal{
String name;
public void move(){
System.out.println("动物在移动!");
}
}
class Cat extends Animal{
public void move()throws Exception{
System.out.println("猫在走猫步!");
}
}
原因:在具有继承关系的两个类中,子类要覆盖父类中的方法的时候,子类中该方法抛出的异常不可以比父类中该方法抛出的异常要多。
解决:子类中的方法抛出的异常应低于父类。
class Animal{
long sum(int a, int b){
return a + b;
}
}
class Cat extends Animal{
int sum(int a, int b){
return a + b;
}
}
class Animal{
public Cat copy(){
return new Cat();
}
}
class Cat extends Animal{
public Animal copy(){
return new Animal();
}
}
原因:对于返回值类型是基本数据类型来说,必须一致。对于返回值类型是引用数据类型来说,重写之后返回值类型可以变的更小(但意义不大,实际开发中没人这样写。)。
原因:只能出现在构造方法第一行,通过当前的构造方法去调用“父类”中的构造方法,目的是:创建子类对象的时候,先初始化该对象的父类型特征。
错误:此处不允许使用修饰符protected
protected class Food {
public static void main(String[] args) {
System.out.println("this is food");
}
}
错误:此处不允许使用修饰符private
private class Food {
public static void main(String[] args) {
System.out.println("this is food");
}
}
原因:类和接口只能用public和默认修饰,其它不行。