我正在为应用创建一个功能,用户提供一些项目和应用,然后应用从数据库中获取价格。这些价格放在地图中,异步任务完成后,排列功能开始。它是什么意思来做基于根据用户的输入而改变的组合的所有排列。我得到ava.lang.NullPointerException:尝试调用虚方法'int java.lang.Integer.intValue()'在null对象referenceMy代码如下:
latest.java
public class latest extends AppCompatActivity {
String major = "";
TextView textView;
public static Map<String,Map<String,Integer>> cart_names = new HashMap<>();
public static Map<String,Map<String,Integer>> cart_names2 = new HashMap<>();
ProgressDialog pd;
ArrayList<String> strhold = new ArrayList<String>();
Activity context;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.content_latest);
Toolbar toolbar = (Toolbar) findViewById(R.id.app_bar);
setSupportActionBar(toolbar);
textView = (TextView) findViewById(R.id.main_text);
context=this;
for (int s=0;s<Search_multiple.cart_records.size();s++){
strhold.add(Search_multiple.cart_records.get(s).getName());
}
if (strhold.size()>0) {
BackTask backTask = new BackTask();
backTask.execute(strhold);
}
}
@Override
public void onStart(){
super.onStart();
String arr[]={};
}
public void goto_main_confirm(View view) {
Intent intent = new Intent(this, MainActivity.class);
startActivity(intent);
}
/* public static void setCart_records(Items item){
cart_records.add(item);
}*/
public void goto_cart_confirm(View view) {
Intent someintent = new Intent(this, CartActiviy.class);
startActivity(someintent);
}
private class BackTask extends AsyncTask<ArrayList<String>, Void, Void> {
protected void onPreExecute() {
super.onPreExecute();
pd = new ProgressDialog(context);
pd.setTitle("Retrieving data");
pd.setMessage("Please wait.");
pd.setCancelable(true);
pd.setIndeterminate(true);
pd.show();
}
protected Void doInBackground(ArrayList<String>... arg0) {
InputStream is = null;
String result = "";
try {
ArrayList<String> name = arg0[0];
String link = "http://chutte.co.nf/get_item_prices.php?";
for (int b = 0; b < name.size(); b++) {
link += "names[]" + "=" + name.get(b);
if (b != name.size() - 1) {
link += "&";
}
}
Log.e("ERROR", link);
URL url = new URL(link);
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
is = urlConnection.getInputStream();
} catch (Exception e) {
if (pd != null)
pd.dismiss();
Log.e("ERROR", e.getMessage());
}
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
StringBuilder builder = new StringBuilder();
String line = null;
while ((line = reader.readLine()) != null) {
builder.append(line + "\n");
}
is.close();
result = builder.toString();
} catch (Exception e) {
Log.e("ERROR", "Error converting result " + e.toString());
}
try {
result = result.substring(result.indexOf("["));
JSONArray jsonArray = new JSONArray(result);
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject jsonObject = jsonArray.getJSONObject(i);
Map<String, Integer> temmap = new HashMap<>();
String temname = jsonObject.getString("Name");
temmap.put("First", jsonObject.getInt("First"));
strhold.add("First");
temmap.put("Second", jsonObject.getInt("Second"));
strhold.add("Second");
temmap.put("Third", jsonObject.getInt("Third"));
strhold.add("Third");
Log.e("ERROR", temmap.get("First").toString());
cart_names.put(temname, temmap);
}
} catch (Exception e) {
Log.e("ERROR", "Error pasting data " + e.toString());
}
return null;
}
protected void onPostExecute(Void result) {
if (pd != null) pd.dismiss();
Log.e("size", cart_names.size() + " ");
if (cart_names.size() == 0) {
textView.setText("Sorry, Error applying data \n" + "Please contact customer service........");
} else {
String[] strhold1 = new String[strhold.size()];
for (int i = 0; i < strhold.size(); i++) {
strhold1[i] = strhold.get(i);
}
Combination.printCombination(strhold1, strhold.size(), 2);
}
}
}
}
Combination.java
Public class Combination {
/* arr[] ---> Input Array
data[] ---> Temporary array to store current combination
start & end ---> Staring and Ending indexes in arr[]
index ---> Current index in data[]
r ---> Size of a combination to be printed */
public static ArrayList<String> finalmap = new ArrayList<>();
public static void combinationUtil(String arr[], String data[], int start,
int end, int index, int r)
{
// Current combination is ready to be printed, print it
if (index == r)
{
ArrayList<String> stringArrayList = new ArrayList<String>();
for (int j=0; j<r; j++)
stringArrayList.add(data[j]);
permute(stringArrayList,0);
return;
}
// replace index with all possible elements. The condition
// "end-i+1 >= r-index" makes sure that including one element
// at index will make a combination with remaining elements
// at remaining positions
for (int i=start; i<=end && end-i+1 >= r-index; i++)
{
data[index] = arr[i];
combinationUtil(arr, data, i+1, end, index+1, r);
}
}
// The main function that prints all combinations of size r
// in arr[] of size n. This function mainly uses combinationUtil()
public static void printCombination(String arr[], int n, int r)
{
// A temporary array to store all combination one by one
String data[]=new String[r];
for(int no = 0;no<arr.length;no++){
boolean decider = true;
for (Map.Entry<String,Map<String,Integer>> entry : latest.cart_names.entrySet()){
if(latest.cart_names.get(entry.getKey()).get(arr[no])==0){
decider=false;
}
}
if (finalmap.size()==0) {
if (decider) {
for (int rt = 0; rt < latest.cart_names.size(); rt++) {
finalmap.add(arr[no]);
}
}
}else{
if (decider) {
int sum1 = 0;
int sum2 = 0;
for (Map.Entry<String, Map<String, Integer>> entry : latest.cart_names.entrySet()) {
sum1 += latest.cart_names.get(entry.getKey()).get(finalmap);
sum2 += latest.cart_names.get(entry.getKey()).get(arr[no]);
}
if (sum2>sum1){
for (int rt = 0; rt < latest.cart_names.size(); rt++) {
finalmap.add(arr[no]);
}
}
}
}
}
// Print all combination using temprary array 'data[]'
combinationUtil(arr, data, 0, n-1, 0, r);
}
public static void permute(ArrayList<String> arr, int k){
for(int i = k; i < arr.size(); i++){
java.util.Collections.swap(arr, i, k);
/*int sum1 = 0;
int sum2 = 0;
int man = 0;
for (Map.Entry<String, Map<String, Integer>> entry : latest.cart_names.entrySet()) {
sum1 += latest.cart_names.get(entry.getKey()).get(finalmap);
sum2+=latest.cart_names.get(entry.getKey()).get(arr.get(man));
man++;
}
if (sum2>sum1){
for (int rt = 0; rt < latest.cart_names.size(); rt++) {
finalmap.add(arr.get(rt));
}
}*/
permute(arr, k+1);
java.util.Collections.swap(arr, k, i);
/* for (Map.Entry<String, Map<String, Integer>> entry : latest.cart_names.entrySet()) {
sum1 += latest.cart_names.get(entry.getKey()).get(finalmap);
sum2+=latest.cart_names.get(entry.getKey()).get(arr.get(man));
man++;
}
if (sum2>sum1){
for (int rt = 0; rt < latest.cart_names.size(); rt++) {
finalmap.add(arr.get(rt));
}
}
}
if (k == arr.size() -1){
for(int woman = 0;woman<finalmap.size();woman++) {
System.out.println(finalmap.get(woman));
}*/
}
}
}
日志
6-15 15:06:41.850 3538-3538/nf.co.riaah.chutte D/AndroidRuntime: Shutting down VM
--------- beginning of crash
06-15 15:06:41.850 3538-3538/nf.co.riaah.chutte E/AndroidRuntime: FATAL EXCEPTION: main
Process: nf.co.riaah.chutte, PID: 3538
java.lang.NullPointerException: Attempt to invoke virtual method 'int java.lang.Integer.intValue()' on a null object reference
at nf.co.riaah.chutte.Combination.printCombination(Combination.java:54)
at nf.co.riaah.chutte.latest$BackTask.onPostExecute(latest.java:173)
at nf.co.riaah.chutte.latest$BackTask.onPostExecute(latest.java:83)
at android.os.AsyncTask.finish(AsyncTask.java:636)
at android.os.AsyncTask.access$500(AsyncTask.java:177)
at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:653)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:139)
at android.app.ActivityThread.main(ActivityThread.java:5298)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:950)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:745)
06-15 15:06:41.851 3538-3538/nf.co.riaah.chutte D/AppTracker: App Event: crash
06-15 15:06:41.883 3538-3538/nf.co.riaah.chutte I/Process: Sending signal. PID: 3538 SIG: 9
06-15 15:06:43.255 3918-3918/nf.co.riaah.chutte D/ThreadedRenderer: mThreadGroupCpuId 2 mRenderThreadCpuId 2 affinity
答案 0 :(得分:0)
看看Combination.java第54行哪个接缝是if(latest.cart_names.get(entry.getKey())。get(arr [no])== 0)(如果我计算正确的话)那么Map中的整数接缝为null。我建议添加一些日志输出或调试以找出问题的确切位置,并检查是否需要添加公牛支票或修复数据。
也许arr[no]
为空。
我建议拆分线并进行一些日志输出以找到问题(或使用调试器)
要找出问题的原因,我会替换:
if(latest.cart_names.get(entry.getKey()).get(arr[no])==0)
到
System.err.println("no: "+no);
String arrayElement=arr[no];
System.err.println("arrayElement: "+arrayElement);
Map<String,Integer> outerMapValue = entry.getValue();
System.err.println("outerMapValue: "+outerMapValue);
if(outerMapValue.get(arrayElement)==0)
<强>说明:强>
if(latest.cart_names.get(entry.getKey())
可以替换为entry.getValue()
Map<String,Map<String,Integer>>
阅读代码时不是很容易理解。您可以考虑引入一个类型来包装内部Map<String,Integer>