在抛出异常的方法中抛出异常
Throw Exception in method who throws this Excpetion
我正在做一个方法,该方法使用 Mojang return 从他的用户名中获取 Minecraft 玩家的 UUID API。此方法在参数中采用一个字符串(我们想知道 UUID 的玩家的用户名)。要使用 API 的结果,我使用 SimpleJSON 库(将 JSON 结果解析为字符串 return)。
我的方法抛出 2 个检查异常:IOExeption 和 Parseexception,因为我想要。
当用户名错误(因此用户名不存在)时,API return 是一个空的 JSON 对象,在这种情况下我的方法会抛出 IOException。这是我的问题,当该方法的参数中有错误的用户名时,该方法会抛出一个新的 IOExcpetion,但是对该方法进行 try 和 catch 时,不会捕获到抛出的异常。
我的方法:
public static String getUUID(String name) throws IOException, ParseException {
URL url = new URL("https://api.mojang.com/users/profiles/minecraft/" + name);
URLConnection uc = url.openConnection();
BufferedReader bf = new BufferedReader(new InputStreamReader(uc.getInputStream()));
StringBuilder response = new StringBuilder();
String inputLine;
while ((inputLine = bf.readLine()) != null) {
response.append(inputLine);
}
bf.close();
if (response.toString().isEmpty()) {
throw new IOException();
}
JSONParser parser = new JSONParser();
Object object = parser.parse(response.toString());
JSONObject jo = (JSONObject) object;
String str = (String) jo.get("id");
return str.replaceAll("(\w{8})(\w{4})(\w{4})(\w{4})(\w{12})", "----");
}
使用有效用户名的示例:
public static void main(String[] args) {
try {
System.out.println(getUUID("Jeb_"));
} catch (IOException | ParseException e) {
e.printStackTrace();
}
}
现在举个用户名错误的例子:
public static void main(String[] args) {
try {
System.out.println(getUUID("d"));
} catch (IOException | ParseException e) {
e.printStackTrace();
}
}
谢谢。
您是否已确认您的异常可能会被捕获?如果被捕获,代码将打印堆栈跟踪。但是如果没有被捕获,JVM 无论如何都会打印堆栈跟踪。
所以抛出一些你可以验证的消息的异常,比如
throw new IOException("Invalid user");
并通过更详细一点来捕获异常:
catch (IOException | ParseException e) {
System.out.println("Could not lookup user "+username+", caught "+e.getClass().getName()+": "+e.getMessage());
}
其实你的异常被捕获了,你可以按如下方式查看:
public static void main(String[] args) {
var username = "d";
try {
System.out.println(getUUID(username));
} catch (IOException | ParseException e) {
System.out.println("User " + username + " not found!");
e.printStackTrace();
}
}
程序的输出将是:
User d not found!
java.io.IOException
at com.company.Main.getUUID(Main.java:37)
at com.company.Main.main(Main.java:17)
此输出表示已执行 catch 块内的代码。
我正在做一个方法,该方法使用 Mojang return 从他的用户名中获取 Minecraft 玩家的 UUID API。此方法在参数中采用一个字符串(我们想知道 UUID 的玩家的用户名)。要使用 API 的结果,我使用 SimpleJSON 库(将 JSON 结果解析为字符串 return)。
我的方法抛出 2 个检查异常:IOExeption 和 Parseexception,因为我想要。 当用户名错误(因此用户名不存在)时,API return 是一个空的 JSON 对象,在这种情况下我的方法会抛出 IOException。这是我的问题,当该方法的参数中有错误的用户名时,该方法会抛出一个新的 IOExcpetion,但是对该方法进行 try 和 catch 时,不会捕获到抛出的异常。
我的方法:
public static String getUUID(String name) throws IOException, ParseException {
URL url = new URL("https://api.mojang.com/users/profiles/minecraft/" + name);
URLConnection uc = url.openConnection();
BufferedReader bf = new BufferedReader(new InputStreamReader(uc.getInputStream()));
StringBuilder response = new StringBuilder();
String inputLine;
while ((inputLine = bf.readLine()) != null) {
response.append(inputLine);
}
bf.close();
if (response.toString().isEmpty()) {
throw new IOException();
}
JSONParser parser = new JSONParser();
Object object = parser.parse(response.toString());
JSONObject jo = (JSONObject) object;
String str = (String) jo.get("id");
return str.replaceAll("(\w{8})(\w{4})(\w{4})(\w{4})(\w{12})", "----");
}
使用有效用户名的示例:
public static void main(String[] args) {
try {
System.out.println(getUUID("Jeb_"));
} catch (IOException | ParseException e) {
e.printStackTrace();
}
}
现在举个用户名错误的例子:
public static void main(String[] args) {
try {
System.out.println(getUUID("d"));
} catch (IOException | ParseException e) {
e.printStackTrace();
}
}
谢谢。
您是否已确认您的异常可能会被捕获?如果被捕获,代码将打印堆栈跟踪。但是如果没有被捕获,JVM 无论如何都会打印堆栈跟踪。
所以抛出一些你可以验证的消息的异常,比如
throw new IOException("Invalid user");
并通过更详细一点来捕获异常:
catch (IOException | ParseException e) {
System.out.println("Could not lookup user "+username+", caught "+e.getClass().getName()+": "+e.getMessage());
}
其实你的异常被捕获了,你可以按如下方式查看:
public static void main(String[] args) {
var username = "d";
try {
System.out.println(getUUID(username));
} catch (IOException | ParseException e) {
System.out.println("User " + username + " not found!");
e.printStackTrace();
}
}
程序的输出将是:
User d not found!
java.io.IOException
at com.company.Main.getUUID(Main.java:37)
at com.company.Main.main(Main.java:17)
此输出表示已执行 catch 块内的代码。