前言

(!!!注意:实际应用时千万别使用中文类名,一者有些程序会报错,二者会被骂……)

今天在做一个项目时遇到了一个获取到当前的 class 类的父路径的问题。

我在网上找了一下,发现大多数的朋友都说:用 this.getClass().getResource("/").getPath(); 的方法得到父路径,但是我在实际操作时出现了一个错误,先看代码

public class Test {
	public static void main(String[] args) {
		String path = this.getClass().getResource("/").getPath();
	}
}

这时 this 这个关键字就会报错,推荐解决方法为:make “main” not static ,但这就违背了它的语法规则(规则:方法前面必须是 public static void,参数是字符串数组类型)。

我想了一下,要不就把这个获取路径定义为本类中的一个独立的成员方法,然后返回它的路径的字符串,这样会如何?接下来我就在 这个类里面,main方法外面 添加了一个方法然后再赋值给main方法里定义的一个用来接收这个字符串的变量:

String getParentPath() {
		return this.getClass().getResource("/").getPath();
	}
	public static void main(String[] args) {
		String parentPath = getParentPath();
	}

这时他还是报错,并给出了两个解决方法:
1.make “main” not static
2.make “XX.getParentPath()” static

其实这两个方法都解决不了这个问题。第一个前面已经解释了,main方法前必须是 public static void,而如果把 getParentPath() 改成 static 了,那么里面的 this 又使用不了了。这也就是说,this关键字在 static 修饰的方法里是不能使用的

我又想了一下,想到了一个方法:定义一个成员变量,然后使用这个成员变量来接收这个 getParentPath() 方法所返回的字符串,这样如何?请看代码:

private static String path;
	//获取父路径的方法
	public String getParentPath() {
		return path = this.getClass().getResource("/").getPath();
	}

那我们是不是得调用这个方法?那怎么调用?当然是需要创建一个对象才能调用咯(是的,我就是忘记了创建对象这步,而是直接调用了方法,所以才筑成了上面的错误……)请看下面:

解决方法

public class Test {
	private static String path;
	//获取父路径的方法
	public String getParentPath() {
		return path = this.getClass().getResource("/").getPath();
	}
	public static void main(String[] args) {
		Test t = new Test();//创建对象
		t.getParentPath();//调用方法来传入路径的字符串值
		String parentPath = path;
		System.out.println(parentPath);
	}
}

这段代码看着挺复杂的,其实我们可以简化一下,请看思路:

1.parentPath = path:
			path 是不是接收了后面的一大串?那我们就可以把 成员变量path 删了,成员方法里面直接返回后面的一串,再使用 temp 调用,就改成:
					parentPath = temp.getParentPath();。
2.这个方法里面只有 return 这句,那也可以把这个方法删了,直接 -> 类.[后面的一大串] <-也就可以了呀!!!

我们照着思路优化一下,请看:

public class Test {
	public static void main(String[] args) {
		Test t = new Test();
		String parentPath = t.getClass().getResource("/").getPath();
		System.out.println(parentPath);
	}
}

那我们还可以这样写:

public class Test {
	public static void main(String[] args) {
		String parentPath = Test.class.getResource("/").getPath();
		System.out.println(parentPath);
	}
}

这种写法也没错,更简便了。但如果后面还需要使用到这个类的方法的话,第一种写法会好些。

总结

其他朋友们给出的解决方法 this.getClass().getResource("/").getPath(); 并没有错,错的原因是因为我们没有创建出这个类的对象,所以就不能得到他的路径。但由于 this不能在静态方法中使用 ,所以我建议先创建出对象,然后写 [对象] + [this 后面的一串] 返回它的父路径。

然而即使如此,我们运行时还发现了一个问题,那就是:乱码!!下面就是我 System.out.println 出来的数据。

/E:/eclipse/HomeWorks/%e6%88%91%e7%9a%84%e5%b7%a5%e5%85%b7/out/production/%e6%88%91%e7%9a%84%e5%b7%a5%e5%85%b7/

这个我们就需要用到 URL 来解析了。

后言

这是我的第三篇文章,代码少错误多,我为我的才疏学浅表示歉意。我会努力改进,争取我少犯错误、大家少走弯路!!
由衷感谢您的观看,您的收获和支持就是我的最大动力!!再次感谢!!!