Java ClassNotFoundException:当我尝试使用Reflect获取类时

Java ClassNotFoundException:当我尝试使用Reflect获取类时,java,javac,Java,Javac,这是我的文件: $ tree . ├── Main.java └── life └── Person.java Main.java 导入生命。人; 公共类主{ 公共静态void main(字符串[]args){ 人员p=新人员(); p、 sayHi(); } } 我试着编译这段代码: $javac Main.java-d。 $java Main 你好,世界 是的,这很好。但当我尝试使用reflect时,我将Main.java更改为: 导入生命。人; 公共类主{ 公共静态void

这是我的文件:

$ tree
.
├── Main.java
└── life
    └── Person.java
Main.java

导入生命。人;
公共类主{
公共静态void main(字符串[]args){
人员p=新人员();
p、 sayHi();
} 
}
我试着编译这段代码:

$javac Main.java-d。
$java Main
你好,世界
是的,这很好。但当我尝试使用reflect时,我将Main.java更改为:

导入生命。人;
公共类主{
公共静态void main(字符串[]args){
Class person=Class.forName(“life.person”);
} 
}
和编译器抛出一个错误:

$ javac Main.java -d .
Main.java:6: error: unreported exception ClassNotFoundException; must be caught or declared to be thrown
    Class person = Class.forName("life.Person");
我很困惑,为什么这段代码先成功后失败


为什么找不到类?

ClassNotFoundException
是一个选中的异常,这意味着语句可能在运行时抛出
ClassNotFoundException
,您需要确定如何在编译阶段处理它

您可以在main方法中将其抛出给调用方:

public static void main(String[] args) throws ClassNotFoundException
或者使用try-catch块:

try {
    Class person = Class.forName("life.Person");
} catch(ClassNotFoundException e) {
     // handle it
}

这并不是说找不到你的班级;这意味着“我可能会抛出一个选中的异常,您需要捕获它”


publicstaticvoidmain(String[]args){
更改为
publicstaticvoidmain(String[]args)抛出ClassNotFoundException{
并请使用IntelliJ或Eclipse之类的IDE进行编程,这会让您的生活更轻松(相信我!)。它们会直接指出这些错误,因为“始终编译”您当前正在处理的代码,因此会指出甚至帮助您解决该错误。感谢您提供此代码片段,它可能会提供一些有限的、即时的帮助。正确的解释将通过说明为什么这是解决p问题,并将使它更有用的未来读者与其他类似的问题。请编辑您的答案,添加一些解释,包括您所做的假设。我有一个评论,说明为什么它是必要的。对我来说已经足够好了。它将很好地添加到您的答案。如果您愿意,您可以添加它。
import life.Person;

public class Main { 
  public static void main(String[] args) { 
    try {
        Class person = Class.forName("life.Person");
    } catch (Exception e) {
        System.err.println(e);
    }
  } 
}