如何解决这个Logcat错误java.lang.AthmeticException:在android中除以零



我一直致力于动态创建表布局,但在我的代码java.lang.AnumericeticException中出现了日志错误:除以零。密码我出错的地方无法从logcat中触发。

  public void servershopimagesoffline() {
     String Specifications = jsonarray;
     try {
         specifi = new JSONArray(Specifications);

     } catch (JSONException e) {
         e.printStackTrace();
     }
     if (specifi.length() > 0) {
         for (int i = 0; i < specifi.length(); i++) {
             try {
                 specification = specifi.getJSONObject(i);
             } catch (JSONException e) {
                 e.printStackTrace();
             }
             TableLayout ll = (TableLayout) findViewById(R.id.maintable);
             // header[i]=new TextView(getApplicationContext());
             try {
                 String type = specification.getString("type");
                 if (type.equalsIgnoreCase("textfield")) {
                     String mainheader = specification.getString("main_header");

                     JSONArray fileopt = specification.getJSONArray("field_option");
                     header = new TextView[fileopt.length()];
                     for (int j = 0; j < fileopt.length(); j++) {
                         JSONObject field = fileopt.getJSONObject(j);
                         row = new TableRow(this);
                         row.setLayoutParams(new TableRow.LayoutParams(
                             ViewGroup.LayoutParams.WRAP_CONTENT,
                             ViewGroup.LayoutParams.WRAP_CONTENT
                         ));
                         header[i] = new TextView(getApplicationContext());
                         String fieldoption = field.getString("inside_single_title");
                         LinearLayout.LayoutParams dim = new LinearLayout.LayoutParams(
                             LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
                         header[i].setLayoutParams(dim);
                         header[i].setText(fieldoption);
                         JSONArray basicopt = field.getJSONArray("basic_opt1");
                         col = new TextView[basicopt.length()];
                         col2 = new TextView[basicopt.length()];
                         row.addView(header[i]);
                         for (int k = 0; k < basicopt.length(); k++) {
                             second = new TableRow(this);
                             second.setLayoutParams(new ViewGroup.LayoutParams(
                                 ViewGroup.LayoutParams.WRAP_CONTENT,
                                 ViewGroup.LayoutParams.WRAP_CONTENT));
                             JSONObject option = basicopt.getJSONObject(k);
                             col[k] = new TextView(getApplicationContext());
                             col2[k] = new TextView(getApplicationContext());
                             col[k].setLayoutParams(dim);
                             col2[k].setLayoutParams(dim);
                             String optnameextra = option.getString("option_name_extra");
                             col[k].setText(optnameextra);
                             String option_desc_extra = option.getString("option_desc_extra");
                             col2[k].setText(option_desc_extra);
                             second.addView(col[k]);
                             second.addView(col2[k]);
                             ll.addView(second);

                         }
                         ll.addView(row);

                     }

                 }
             } catch (JSONException e) {
                 e.printStackTrace();
             }

         }
     }

 }

Logcat错误

05 - 13 12: 10: 21.308 14880 - 14880 / com.journaldev.navigationdrawer E / AndroidRuntime: FATAL EXCEPTION: main
java.lang.ArithmeticException: divide by zero
at android.widget.TableLayout.mutateColumnsWidth(TableLayout.java: 583)
at android.widget.TableLayout.shrinkAndStretchColumns(TableLayout.java: 572)
at android.widget.TableLayout.measureVertical(TableLayout.java: 470)
at android.widget.TableLayout.onMeasure(TableLayout.java: 435)
at android.view.View.measure(View.java: 15172)
at android.widget.ScrollView.measureChildWithMargins(ScrollView.java: 1196)
at android.widget.FrameLayout.onMeasure(FrameLayout.java: 310)
at android.widget.ScrollView.onMeasure(ScrollView.java: 318)
at android.view.View.measure(View.java: 15172)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java: 4814)
at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java: 1390)
at android.widget.LinearLayout.measureHorizontal(LinearLayout.java: 1038)
at android.widget.LinearLayout.onMeasure(LinearLayout.java: 576)
at android.view.View.measure(View.java: 15172)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java: 4814)
at android.widget.FrameLayout.onMeasure(FrameLayout.java: 310)
at android.support.v7.internal.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java: 124)
at android.view.View.measure(View.java: 15172)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java: 4814)
at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java: 1390)
at android.widget.LinearLayout.measureVertical(LinearLayout.java: 681)
at android.widget.LinearLayout.onMeasure(LinearLayout.java: 574)
at android.view.View.measure(View.java: 15172)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java: 4814)
at android.widget.FrameLayout.onMeasure(FrameLayout.java: 310)
at android.view.View.measure(View.java: 15172)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java: 4814)
at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java: 1390)
at android.widget.LinearLayout.measureVertical(LinearLayout.java: 681)
at android.widget.LinearLayout.onMeasure(LinearLayout.java: 574)
at android.view.View.measure(View.java: 15172)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java: 4814)
at android.widget.FrameLayout.onMeasure(FrameLayout.java: 310)
at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java: 2148)
at android.view.View.measure(View.java: 15172)
at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java: 1848)
at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java: 1100)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java: 1273)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java: 998)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java: 4212)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java: 725)
at android.view.Choreographer.doCallbacks(Choreographer.java: 555)
at android.view.Choreographer.doFrame(Choreographer.java: 525)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java: 711)
at android.os.Handler.handleCallback(Handler.java: 615)
at android.os.Handler.dispatchMessage(Handler.java: 92)
at android.os.Looper.loop(Looper.java: 137)
at android.app.ActivityThread.main(ActivityThread.java: 4745)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java: 511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java: 786)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java: 553)
at dalvik.system.NativeStart.main(Native Method)
05 - 13 12: 15: 21.336 14880 - 14880 / com.journaldev.navigationdrawer I / Process: Sending signal.PID: 14880 SIG: 9

我还不清楚问题是什么,但我做了一些研究,注意到了以下几点:

TableLayout的开发人员文档提到"TableLayout子级不能指定layout_width属性。宽度始终为MATCH_PARENT"。您可以尝试根本不设置宽度,或者默认为MATCH_PARENT

然后,在TableLayout的源代码中,在第583行周围,以计数为除数执行除法。可能发生的情况是,由于您将TableLayout的子级宽度设置为WRAP_CONTENT,它们没有正确添加,因此计数为0。

否则,我建议在TableLayout的onMeasure()中插入一个断点,看看情况是否确实如此,并尽量避免使用WRAP_CONTENT

祝你好运,作为最后一句话,我还建议你尽量避免代码中出现这种数量的缩进。读起来很费劲!

我认为问题出在这里

row = new TableRow(this);
row.setLayoutParams(new TableRow.LayoutParams(
    ViewGroup.LayoutParams.WRAP_CONTENT,
    ViewGroup.LayoutParams.WRAP_CONTENT)); 

您应该将ViewGroup.LayoutParams更改为TableLayout.LayoutParams

最后我得到了问题的答案,因为dyanamic行必须创建Layout params

 header[i].setLayoutParams(new TableRow.LayoutParams(TableRow.LayoutParams.FILL_PARENT, TableRow.LayoutParams.WRAP_CONTENT))

对于表格布局创建布局参数

ll.addView(row,newTableLayout.LayoutParams(TableLayout.LayoutParams.FILL_PARENT, TableLayout.LayoutParams.WRAP_CONTENT));`

"表格布局"小部件有一些规则,如果您将高度设置为wrap_content,则宽度必须与子布局的父布局匹配。

最新更新