使用ProGuard时的JavaNullPointerException
我有以下代码来解析来自Internet的JSON文件:使用ProGuard时的JavaNullPointerException,java,android,Java,Android,我有以下代码来解析来自Internet的JSON文件: class getOnlineFeesInfo extends AsyncTask<URL, Integer, Long> { public String feesJsonString; protected Long doInBackground(URL... urls) { String language = Locale.getDefault().getLanguage(); long state = 0;
class getOnlineFeesInfo extends AsyncTask<URL, Integer, Long> {
public String feesJsonString;
protected Long doInBackground(URL... urls) {
String language = Locale.getDefault().getLanguage();
long state = 0;
HttpURLConnection c = null;
try {
String url = "http://www.myweb.com/api/fees_" + language + ".json";
URL u = new URL(url);
c = (HttpURLConnection) u.openConnection();
c.setRequestMethod("GET");
c.setRequestProperty("Content-length", "0");
c.setUseCaches(false);
c.setAllowUserInteraction(false);
c.setConnectTimeout(100000);
c.setReadTimeout(100000);
c.connect();
int status = c.getResponseCode();
switch (status) {
case 200:
case 201:
BufferedReader br = new BufferedReader(new InputStreamReader(c.getInputStream()));
StringBuilder sb = new StringBuilder();
String line;
while ((line = br.readLine()) != null) {
sb.append(line + "\n");
}
br.close();
feesJsonString = sb.toString();
try {
System.out.println("Reading JSON from a file");
System.out.println("----------------------------");
JsonReader reader = new JsonReader(new StringReader(feesJsonString));
Gson gson = new GsonBuilder().create();
feesJson parser = gson.fromJson(reader, feesJson.class);
parser.setData();
for (String[] miniRecargasArray : Global.recargasArray) {
System.out.println(miniRecargasArray[0]);
}
for (String[] miniOficinasArray : Global.oficinasArray) {
System.out.println(miniOficinasArray[0]);
}
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
} catch (MalformedURLException ex) {
Logger.getLogger(getClass().getName()).log(Level.SEVERE, null, ex);
} catch (IOException ex) {
Logger.getLogger(getClass().getName()).log(Level.SEVERE, null, ex);
} finally {
if (c != null) {
try {
c.disconnect();
} catch (Exception ex) {
Logger.getLogger(getClass().getName()).log(Level.SEVERE, null, ex);
}
}
}
state = 1;
return state;
}
}
堆栈跟踪:
# Add project specific ProGuard rules here.
##---------------Begin: proguard configuration for Gson ----------
# Gson uses generic type information stored in a class file when working with fields. Proguard
# removes such information by default, so configure it to keep all of it.
-keepattributes Signature
# For using GSON @Expose annotation
-keepattributes *Annotation*
# Gson specific classes
-keep class sun.misc.Unsafe { *; }
#-keep class com.google.gson.stream.** { *; }
# Application classes that will be serialized/deserialized over Gson
-keep class com.google.gson.examples.android.model.** { *; }
##---------------End: proguard configuration for Gson ----------
08-17 01:37:31.974 31900-32075/? E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #1
Process: com.packageName.app
java.lang.RuntimeException: An error occured while executing doInBackground()
at android.os.AsyncTask$3.done(AsyncTask.java:300)
at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
at java.util.concurrent.FutureTask.run(FutureTask.java:242)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
at java.lang.Thread.run(Thread.java:841)
Caused by: java.lang.NullPointerException
at com.packageName.app.ab.a(Unknown Source)
at com.packageName.app.ac.a(Unknown Source)
at com.packageName.app.ac.doInBackground(Unknown Source)
at android.os.AsyncTask$2.call(AsyncTask.java:288)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
at java.lang.Thread.run(Thread.java:841)
似乎您需要为gson配置proguard。查看此示例配置:
如果没有StackTraceOne,很难提供帮助,但是堆栈跟踪仍然是模糊的……您的代码结构不正确。取决于先前
try
块成功与否的代码应位于该try
块内。目前,如果获取URL失败,您仍然会执行JSON代码。不要编写这样的代码。@EJP已更改,但我认为它不是重复的,因为它只有在启用proguard时才会崩溃,尽管我已经将其设置为使用gson,正如我所发布的那样。我理解什么是JNPE,但我认为这是一个不同的问题。谢谢,但我已经设置好了,没有任何改变。。。