一、标识符与关键字

1、 错误: 需要<标识符>

class 123ABC{
	
}

错误原因:编译器检测到class这个单词,那么编译器会从class这个单词后面找类名,而类名是标识符,编译器找了半天没有找到标识符,因为123ABC不是标识符,所以编译器提示的错误信息是:需要<标识符>

解决办法:将123ABC修改为合法的标识符。

2、错误: 需要'{'

class Hello World{
	
}

错误原因:编译器检测到class这个单词,然后找class后面的标识符,编译器找到了一个合法的标识符叫做“Hello”,然后编译器继续往后找“{”,结果没有找到“{”,所以报错了。

解决办法:①把World删除;②把空格删除。

二、变量

1、错误: 可能尚未初始化变量age


public static void main(String[] args){
		int age;
        System.out.println(age);
}

错误原因:在访问变量age前没有赋初值。

解决办法:在访问变量age前为其赋初值。

2、错误: 找不到符号

1)情形1

public static void main(String[] args){
		System.out.println(k);
		int k = 1;	
}

错误原因:在访问变量之前没有声明赋值,因为方法体中的语句严格按照自上而下的顺序执行的,不可能自下而上执行。

解决办法:把声明赋值变量的语句写到访问该变量的语句之前。

2)情形2

public static void main(String[] args){
		int a = name;
}

错误原因:编译器会认为name是一个变量,name从未声明并赋值过。

解决办法:对name声明并赋值。

3、错误: 已在方法 main(String[])中定义了变量 a

public static void main(String[] args){
		int a;
		int a;
}
public static void main(String[] args){
	int a = 10;
	double a = 3.14;
}

错误原因:变量在同一个域当中不能重复声明、不能重名。

解决办法:变量只需声明一次即可,声明其他类型变量时不要与之前已声明的变量重名。

4、错误: 不兼容的类型: String无法转换为int

public static void main(String[] args){
		int a = "hello";
}

错误原因:等号前后的数据类型不匹配。

解决办法:①类型修改为String;②数据修改为整型数据。

三、数据类型

1、错误: 未结束的字符文字

public static void main(String[] args){
	char c2 = 'ab';
}

错误原因:编译器检测到了左半段单引号,然后找左半段单引号后面的字符,编译器找到了一个字符a,然后编译器继续往后找右半段单引号,结果没有找到右半段单引号,所以报错未结束的字符文字,因为右半段单引号表示一个字符的结束。

解决办法:char类型的字面量只能是单引号括起来的单个字符。

2、 错误: 不兼容的类型: 从xx类型换到xx类型可能会有损失

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类型的变量。

解决办法:强制类型转换,但执行时可能会有精度损失。

3、错误: 整数太大

	public static void main(String[] args){
		long l = 2147483648;
		System.out.println(l);
	}

错误原因:2147483648是int类型的字面量,但超出了int的表示范围,所以在没有赋值之前就出错了。

解决办法:int型字面量后加L变成long型字面量。

四、运算符

1、错误: 二元运算符 '&' 的操作数类型错误

public static void main(String[] args){
    System.out.println(true & 10); 
}

错误原因:逻辑运算符两边的数据类型必须是boolean,不能是其他数据类型。

解决办法:两边数据类型都改为boolean类型即可。

2、错误: 不兼容的类型: 条件表达式中的类型错误

	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数据类型改为字符型。

五、控制语句

1、错误: 有 'if', 但是没有 'else'

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,所以报错。

解决办法:养成加括号的习惯。

六、方法

1、错误: 缺少返回语句

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;
	}
	

七、认识面向对象

1、错误: 无法从静态上下文中引用非静态 变量

原因:没有创建对象就去用类名.访问实例变量。

解决:实例变量应该先创建对象,用对象.的方式去访问。

八、对象的创建和使用

1、错误: 此处不允许使用修饰符static

public class Student{
	String no;
	String name;
	int age;
	public static Student(){
		
	}
}

原因:构造方法的修饰符列表中加了static

解决:static去掉。

2、错误: 方法声明无效; 需要返回类型

public class Student{
	String no;
	String name;
	int age;

	public student(){
		
	}
}

原因:编译器检测到方法名和类名不相同,会认为该方法是一个普通方法,又进一步检测到该普通方法无返回值类型,所以报错。

解决:构造方法名应该和类名相同且无返回值类型,普通方法有返回值类型。

3、错误: 无法将类 Student中的构造器 Student应用到给定类型;

原因:如果只写了有参构造方法,无参构造方法没有写,那么系统不再提供无参构造方法。所以在创建对象的时候调用无参构造方法编译会报错。

解决:最好任何时候都将无参构造方法写出来。

九、static和this

1、错误: 对this的调用必须是构造器中的第一个语句

原因:在构造方法体中,this();语句前面写了其他语句;

解决:this() 这种语法只能出现在构造方法第一行,表示当前构造方法调用本类其他的构造方法,目的是代码复用。

十、继承

1、错误: Cat中的move()无法覆盖Animal中的move(), 正在尝试分配更低的访问权限; 以前为public

class Animal{
	String name;
	public void move(){
		System.out.println("动物在移动!");
	}
}
class Cat extends Animal{
	protected void move(){
		System.out.println("猫在走猫步!");
	}
}

原因:在具有继承关系的两个类中,子类要覆盖父类中的方法的时候,子类中该方法的访问权限不可以比父类中该方法的访问权限更低。

解决:子类中的方法访问权限应高于或等于父类。

2、错误: Cat中的move()无法覆盖Animal中的move(),被覆盖的方法未抛出Exception

class Animal{
	String name;
	public void move(){
		System.out.println("动物在移动!");
	}
}
class Cat extends Animal{
	public void move()throws Exception{
		System.out.println("猫在走猫步!");
	}
}

原因:在具有继承关系的两个类中,子类要覆盖父类中的方法的时候,子类中该方法抛出的异常不可以比父类中该方法抛出的异常要多。

解决:子类中的方法抛出的异常应低于父类。

3、错误: Cat中的sum(int,int)无法覆盖Animal中的sum(int,int),返回类型int与long不兼容;Cat中的copy()无法覆盖Animal中的copy()返回类型Animal与Cat不兼容

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();
	}

}

原因:对于返回值类型是基本数据类型来说,必须一致。对于返回值类型是引用数据类型来说,重写之后返回值类型可以变的更小(但意义不大,实际开发中没人这样写。)。

4、错误: 对super的调用必须是构造器中的第一个语句

原因:只能出现在构造方法第一行,通过当前的构造方法去调用“父类”中的构造方法,目的是:创建子类对象的时候,先初始化该对象的父类型特征。

十一、面向对象进阶

1、类和接口的权限修饰符相关错误

错误:此处不允许使用修饰符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默认修饰,其它不行。

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐