我也不太确定,我个人觉得吧:
你的这句FsmainMethod.invoke(null, new Object[] {new String [] {"111","222","333","444"}});执行成功了,可以推出你的main函数定义为:public static void main(Object o,Object[] args)。
然后你又使用:FsmainMethod.invoke(null,(Object) new String [] {"111","222","333","444"});这句对应的main的定义为public static void main(Object o,Object args)。
前者传入Object,Object[],后者传入Object,Object,后者相当于重载了前者,但是重载这个说法也不对,一个类只能有一个main函数,所以是后者调用错了,你的类里应该是没有public static void main(Object o,Object args)这个方法的。
Java 允许我们定义自己的异常,这样的异常就称为自定义异常。定义自定义异常的方式是继承 Exception 类,然后定义一个类来代表该异常。
下面是定义自定义异常类的示例:
================。
public class MyException extends Exception {。
public MyException() {。
super();
public MyException(String message) {。
super(message);。
================。
这里定义了一个名为 MyException 的类,它继承了 Exception 类,并定义了两个构造方法,一个是无参构造方法,另一个是带有一个字符串参数的构造方法,该字符串参数用于传入错误信息。
接下来,我们可以在可能抛出异常的方法中使用 throws 关键字声明该方法可能抛出的异常,并在方法中使用 throw 语句抛出异常。例如:
================。
public class UsingMyException {。
public void f() throws MyException {。
System.out.println("抛出异常MyException 从 f()方法");。
throw new MyException();。
public void g() throws MyException {。
System.out.println("抛出异常MyException 从 g()方法");。
throw new MyException("从g()方法中抛出异常");。
================。
这里我们定义了一个名为 UsingMyException 的类,它包含两个方法: f() 和 g()。两个方法都使用了 throws 关键字声明它们可能会抛出 MyException 异常,并在方法内部使用 throw 语句抛出该异常。
最近在回顾基础知识的时候,想要用文本编辑器+控制台的方式写java程序,发现习惯了IDE,使用基础命令就遇到一些问题,比如,我在D:\MavenTrainingSpace\hello-world\src\main\java\jar\App.java文件中写了个HelloWorld程序:
package jar;
/**
* Hello world!
*/
public class App。
public String satHello(){。
return "Hello World";。
public static void main( String[] args )。
System.out.println(new App().satHello());。
然后用maven编译之后生成了D:\MavenTrainingSpace\hello-world\target\classes\jar\App.class文件,我想运行这个class,打印Hello World:
PS D:\MavenTrainingSpace\hello-world> java App。
错误: 找不到或无法加载主类 App。
登录后复制
注意我当前的路径,是在D:\MavenTrainingSpace\hello-world下的,结果就是报错了,找不到主类。
其实原因很简单了:
java指令默认在寻找class文件的地址是通过CLASSPATH环境变量中指定的目录中寻找的。
我们忽略了package的影响。
原因1,就是说我们要找的类必须在CLASSPATH,而系统环境变量我们一般是这么配的:。
.;C:\Program Files\Java\jdk1.8.0_131\lib\dt.jar;C:\Program Files\Java\jdk1.8.0_131\lib\tools.jar;。
登录后复制
第一个分号前的.表示执行java命令所在的当前目录,其他的则是jdk的类,与我们的问题无关,既然这样,我们当前的目录在哪儿呢?答案是D:\MavenTrainingSpace\hello-world下,在这个当前目录下可能是没有这个类的,那我们到D:\MavenTrainingSpace\hello-world\target\classes\jar\,在运行一下看看:
D:\MavenTrainingSpace\hello-world\target\classes\jar> java App。
错误: 找不到或无法加载主类 App。
登录后复制
还是不行,这是因为,App类被定义在package jar;里面,所以类的加载路径是jar/App.class,所以我们到D:\MavenTrainingSpace\hello-world\target\classes下面:
D:\MavenTrainingSpace\hello-world\target\classes> java App。
错误: 找不到或无法加载主类 App****。
登录后复制
还是报错,这就是原因2所说的"忽略了package的影响",因为加载一个类,是需要完整的类名,所以必须要把报名带上:
PS D:\MavenTrainingSpace\hello-world\target\classes> java jar.App。
Hello World
登录后复制
这样就行了。
网上的教程到这里一般就结束了,但是我在想,这样太挫了吧,不停的切换目录,而且如果我们在eclipse中新建一个java项目,为什么就能找到这个App.class并且加载它呢,
其实说到底还是CLASSPATH的事情,java命令执行的时候可以带上一个参数:-classpath [路径],指明了java加载的路径,那么就是说我们可以这样做,我先到一个无关的路径下:
D:\> java -classpath "D:\MavenTrainingSpace\hello-world\target\classes" jar.App。
Hello World
登录后复制
你看,我切到了D盘,但是执行的时候,把class所在的路径放在了classpath参数上了,java就明白了要从这个路径里面按照包结构找。
然后回到eclipse的问题上,eclipse为我们做了什么事儿,使得我们不需要关注这些了呢,其实就是每个项目,eclipse生成了一个.classpath的文件,通过这个文件,eclipse在执行java命令的时候,就告诉了java命令该去哪里加载类。
inflating这个压缩方式的问题。应该没有这种的压缩方式吧,应该是inflate。
从错误信息来看,是缺少SQLServer的JDBC驱动包,可以通过如下方式解决:
1、如果是maven程序,在pom文件中加入sqlserver驱动。
<dependency>。
<groupId>com.microsoft.sqlserver</groupId>。
<artifactId>mssql-jdbc</artifactId>。
<version>7.3.1.jre12-preview</version>。
<scope>test</scope>。
</dependency>。
2、如果不是maven程序,百度搜索jdbc sqlserver jar ,然后把下载的jar引入到程序中。