Discuss / Java / 说是字段不存在的错误

说是字段不存在的错误

Topic source

运行后报错:

Exception in thread "main" java.lang.Error: Unresolved compilation problems: 

Unhandled exception type NoSuchFieldException

Unhandled exception type NoSuchFieldException

Unhandled exception type IllegalAccessException

Unhandled exception type IllegalAccessException

包也导入了,在eclipse中相应的行显示Unhandled exception type NoSuchFieldException,问题是这个字段是有的啊,并且用的是 c.getDeclaredField("name");并不存在private的问题,为什么呢

package com.itranswarp.learnjava;
import java.lang.reflect.Field;
/**
 * Learn Java from https://www.liaoxuefeng.com/
 * 
 * @author liaoxuefeng
 */
public class Main {

	public static void main(String[] args) {
		String name = "Xiao Ming";
		int age = 20;
		Person p = new Person();
		// TODO: 利用反射给name和age字段赋值:
		Class c = p.getClass();
		System.out.println(p.getName()); // "Xiao Ming"
		System.out.println(p.getAge()); // 20
		Field ppname = c.getDeclaredField("name");
		Field ppage = c.getDeclaredField("age");
		ppname.setAccessible(true);
		ppage.setAccessible(true);
		ppname.set(c, name);
		ppage.set(c, age);
		System.out.println(p.getName()); 
		System.out.println(p.getAge()); 
	}
}

后来看了其他人的作业,发现两个问题

1. set()里面我错误地用了Class实例c而不是Person实例p

2.Main函数中没有throws Exception

关于第二点有些疑惑,为什么会出现Exception需要throws呢,难道不是应该没有异常的吗

Karck_x

#3 Created at ... [Delete] [Delete and Lock User]

异常需要捕获,如果不捕获就要向上抛出。

你调用的方法它在字段不存在的时候抛出异常,抛到你执行的这段代码,你必须在这里处理异常。

你认为的没有异常只是你认为你写的代码是不会发生异常的,你可以写一个不存在的字段试试,异常就会被捕获或抛出了。

AlaGeek

#4 Created at ... [Delete] [Delete and Lock User]

这个函数在定义的时候,就标注了,可能会抛出没有这个字段这样一个异常,那么你在写的时候就要去捕获这个可能的异常,不然就会出错,或者你在main那里也把这个异常抛出去

那么我看其他答案都是在Main把异常抛出了,所以实际上应该用try catch吗?

东火木1991

#6 Created at ... [Delete] [Delete and Lock User]

都可以,你不想在方法调用时用try catch捕获那就让上一层调用者(也就是main方法)声明异常,让上上层也就是解释器去自动捕获


  • 1

Reply