GVKun编程网logo

Apache POI-FileInputStream有效,文件对象失败(NullPointerException)(fileinputstream文件不存在)

8

如果您想了解ApachePOI-FileInputStream有效,文件对象失败的相关知识,那么本文是一篇不可错过的文章,我们将对NullPointerException进行全面详尽的解释,并且为您提

如果您想了解Apache POI-FileInputStream有效,文件对象失败的相关知识,那么本文是一篇不可错过的文章,我们将对NullPointerException进行全面详尽的解释,并且为您提供关于Android HttpUrlConnection getInputStream引发NullPointerException、android – achartengine toScreenPoint(double)总是返回nullPointerException、android – BufferedInputStream或FileInputStream IOException、android – Gradle Execution因任务extractReleaseAnnotations> java.lang.NullPointerException而失败的有价值的信息。

本文目录一览:

Apache POI-FileInputStream有效,文件对象失败(NullPointerException)(fileinputstream文件不存在)

Apache POI-FileInputStream有效,文件对象失败(NullPointerException)(fileinputstream文件不存在)

我尝试将所有工作表从一个工作簿复制到另一工作簿。事实是,如果我通过FileInputStreams读取工作簿,它可以正常工作,但不适用于文件对象。

请考虑以下方法:

import java.io.BufferedReader;import java.io.File;import java.io.FileFilter;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.net.URL;import java.util.ArrayList;import java.util.Iterator;import org.apache.commons.io.IOUtils;import org.apache.commons.io.filefilter.WildcardFileFilter;import org.apache.poi.EncryptedDocumentException;import org.apache.poi.openxml4j.exceptions.InvalidFormatException;import org.apache.poi.ss.SpreadsheetVersion;import org.apache.poi.ss.usermodel.Cell;import org.apache.poi.ss.usermodel.CellStyle;import org.apache.poi.ss.usermodel.CellType;import org.apache.poi.ss.usermodel.DataConsolidateFunction;import org.apache.poi.ss.usermodel.DateUtil;import org.apache.poi.ss.usermodel.Font;import org.apache.poi.ss.usermodel.Row;import org.apache.poi.ss.usermodel.Sheet;import org.apache.poi.ss.usermodel.Workbook;import org.apache.poi.ss.usermodel.WorkbookFactory;import org.apache.poi.ss.util.AreaReference;import org.apache.poi.ss.util.CellReference;import org.apache.poi.xssf.usermodel.XSSFPivotTable;import org.apache.poi.xssf.usermodel.XSSFSheet;public void copyAllSheetsAcrossWorkbook(String oldWorkbook, String newWorkbook)        throws EncryptedDocumentException, InvalidFormatException, IOException {    FileInputStream fisOld = null;    FileInputStream fisNew = null;    Workbook oldWB = null;    Workbook newWB = null;    FileOutputStream fileOut = null;    System.out.println("oldWorkbook: " + oldWorkbook);    System.out.println("newWorkbook: " + newWorkbook);    fisOld = new FileInputStream(oldWorkbook);    fisNew = new FileInputStream(newWorkbook);    // THIS WORKS    // oldWB = WorkbookFactory.create(fisOld);    // newWB = WorkbookFactory.create(fisNew);    // THIS DOES NOT WORK    oldWB = WorkbookFactory.create(new File(oldWorkbook));    newWB = WorkbookFactory.create(new File(newWorkbook));    if (newWB == null) {        System.out.println("newWB is null");    }    // CellStyle newStyle = newWB.createCellStyle();    Row row;    Cell cell;    copiedSheets = new ArrayList<String>();    for (int i = 0; i < oldWB.getNumberOfSheets(); i++) {        XSSFSheet sheetFromOldWB = (XSSFSheet) oldWB.getSheetAt(i);        String sheetNameFromOldWB = sheetFromOldWB.getSheetName();        XSSFSheet sheetForNewWB = (XSSFSheet) newWB.getSheet(sheetNameFromOldWB);        if (sheetForNewWB != null) {            int sheetIndex = newWB.getSheetIndex(sheetNameFromOldWB);            newWB.removeSheetAt(sheetIndex);        }        LOGGER.info("Copying to new Workbook: " + sheetNameFromOldWB);        sheetForNewWB = (XSSFSheet) newWB.createSheet(sheetFromOldWB.getSheetName());        for (int rowIndex = 0; rowIndex < sheetFromOldWB.getPhysicalNumberOfRows(); rowIndex++) {            row = sheetForNewWB.createRow(rowIndex);            for (int colIndex = 0; colIndex < sheetFromOldWB.getRow(rowIndex).getPhysicalNumberOfCells(); colIndex++) {                cell = row.createCell(colIndex);                // get cell from old WB''s sheet and when cell is null, return as blank cells.                Cell c = sheetFromOldWB.getRow(rowIndex).getCell(colIndex, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK);                // Below is where all the copying is happening.                // CellStyle origStyle = c.getCellStyle();                // newStyle.cloneStyleFrom(origStyle);                // cell.setCellStyle(newStyle);                switch (c.getCellTypeEnum()) {                case STRING:                    cell.setCellValue(c.getRichStringCellValue().getString());                    break;                case NUMERIC:                    if (DateUtil.isCellDateFormatted(cell)) {                        cell.setCellValue(c.getDateCellValue());                    } else {                        cell.setCellValue(c.getNumericCellValue());                    }                    break;                case BOOLEAN:                    cell.setCellValue(c.getBooleanCellValue());                    break;                case FORMULA:                    cell.setCellFormula(c.getCellFormula());                    break;                default:                    break;                }            }        }        copiedSheets.add(oldWB.getSheetName(i));    }    fileOut = new FileOutputStream(newWorkbook);    newWB.write(fileOut); // <------ HERE I GET NULLPOINTEREXCEPTION    fisOld.close();    fisNew.close();    oldWB.close();    fileOut.close();    newWB.close();

我在收到以下异常newWB.write(fileOut);

Exception in thread "main" org.apache.poi.POIXMLException: java.lang.NullPointerExceptionat org.apache.poi.POIXMLDocument.getProperties(POIXMLDocument.java:168)at org.apache.poi.POIXMLDocument.write(POIXMLDocument.java:246)at com.capgemini.toolkit.App.copyAllSheetsAcrossWorkbook(App.java:263)at com.capgemini.toolkit.App.main(App.java:58)Caused by: java.lang.NullPointerExceptionat org.apache.poi.openxml4j.util.ZipSecureFile$ThresholdInputStream.read(ZipSecureFile.java:210)at com.sun.org.apache.xerces.internal.impl.XMLEntityManager$RewindableInputStream.read(Unknown Source)at com.sun.org.apache.xerces.internal.impl.XMLEntityManager.setupCurrentEntity(Unknown Source)at com.sun.org.apache.xerces.internal.impl.XMLVersionDetector.determineDocVersion(Unknown Source)at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(Unknown Source)at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(Unknown Source)at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(Unknown Source)at javax.xml.parsers.DocumentBuilder.parse(Unknown Source)at org.apache.poi.util.DocumentHelper.readDocument(DocumentHelper.java:140)at org.apache.poi.POIXMLTypeLoader.parse(POIXMLTypeLoader.java:143)at org.openxmlformats.schemas.officeDocument.x2006.extendedProperties.PropertiesDocument$Factory.parse(Unknown Source)at org.apache.poi.POIXMLProperties.<init>(POIXMLProperties.java:78)at org.apache.poi.POIXMLDocument.getProperties(POIXMLDocument.java:166)... 3 more

在POI文档中,始终会提到File由于内存消耗较低而更好地使用了对象。这就是为什么我想知道为什么它不适用于File对象。

为了进行测试,这是在主方法中运行的唯一方法,我使用了2个带有一些伪数据的新Excel文件(.xlsx)。

有谁知道为什么它不能与File对象一起使用?难道我做错了什么?

仅供参考:我正在使用POI 3.16。

答案1

小编典典

使用a File而不是a FileInputStream来打开a
Workbook会减少内存占用,因为在XSSF*.xlsx)的情况下,ZipPackage将*.xlsx直接从文件中打开,而不是将全部ZIP内容读取到内存中。

但这也意味着,将ZipPackage打开文件,直到Workbook将文件关闭。因此,在Workbook将被关闭之前,无法同时写入该文件。因此,由于不可能将Workbook内容从Workbook打开时的位置写回到相同的文件,因此,如果您只想从中读取内容,则使用a
File代替FileInputStream打开a
Workbook可以Workbook。但是,如果您要读取和写入相同的文件,则无法使用。然后FileInputStreamFileOutputStream需要。

因此,在您的情况下,您尝试Workbook newWB从中读取File,然后使用将其Workbook写入同一文件

fileOut = new FileOutputStream(newWorkbook);newWB.write(fileOut);

文件已经打开时。这失败了。

但:

   fisNew = new FileInputStream(newWorkbook);   oldWB = WorkbookFactory.create(new File(oldWorkbook));   newWB = WorkbookFactory.create(fisNew);...   fileOut = new FileOutputStream(newWorkbook);   newWB.write(fileOut);   fileOut.close();   oldWB.close();   newWB.close();

应该管用。

顺便说一句:如果您使用File,则您不应FileInputStream在同一文件中使用。所以不要使用fisOld

使用的另一个缺点File,而不是FileInputStream打开一个Workbook是同时关闭Workbook,因此隐含关闭垫层文件系统(POIFSFileSystem在的情况下,HSSFZipPackage在以下情况下XSSF)的文件中获取更新的最后修改日期。没有对文件进行任何更改,但是文件已被打开并将新的文件写入文件系统。这就是为什么上次修改日期被更新的原因。


编辑2017年9月21日:使用a的缺点File似乎比想像的要严重。OPCPackage.close还将所有更改保存到底层OPCPackage。因此,如果您XSSFWorkbook从文件中打开一个文件,然后想使用将更改内容写入另一个文件中write(java.io.OutputStreamstream),则在关闭时也会更改源文件OPCPackage。仅当发生该问题 write(java.io.OutputStreamstream)从用于XSSFWorkbook从那以后POIXMLDocument.write被称为它调用POIXMLDocumentPart.onSave其中“保存在底层OOXML包的变化。”。因此,系统OPCPackage会在关闭前使用所有更改进行更新。

简短示例:

import org.apache.poi.ss.usermodel.*;import java.io.File;import java.io.FileOutputStream;class ReadAndWriteExcelWorkbook { public static void main(String[] args) throws Exception {  Workbook workbook  = WorkbookFactory.create(new File("file.xlsx"));  Sheet sheet = workbook.getSheetAt(0);  Row row = sheet.getRow(0);  if (row == null) row = sheet.createRow(0);  Cell cell = row.getCell(0);  if (cell == null) cell = row.createCell(0);  cell.setCellValue("changed");  FileOutputStream out = new FileOutputStream("fileNew.xlsx");  workbook.write(out);  out.close();  workbook.close(); }}

此代码之后,两个文件fileNew.xlsx以及file.xlsx都被更改。

Android HttpUrlConnection getInputStream引发NullPointerException

Android HttpUrlConnection getInputStream引发NullPointerException

我正在尝试从以下网址下载图像:

https://hme_player_pictures.s3.amazonaws.com/test-512813ed3b83286c72f376c7-thumb100.jpg

这是堆栈跟踪:

03-21 12:58:04.040: W/System.err(7084): java.lang.NullPointerException
03-21 12:58:04.040: W/System.err(7084):     at libcore.net.http.httpconnection$Address.hashCode(httpconnection.java:343)
03-21 12:58:04.045: W/System.err(7084):     at java.util.HashMap.get(HashMap.java:298)
03-21 12:58:04.050: W/System.err(7084):     at libcore.net.http.httpconnectionPool.get(httpconnectionPool.java:67)
03-21 12:58:04.050: W/System.err(7084):     at libcore.net.http.httpconnection.connect(httpconnection.java:128)
03-21 12:58:04.050: W/System.err(7084):     at libcore.net.http.HttpEngine.openSocketConnection(HttpEngine.java:308)
03-21 12:58:04.055: W/System.err(7084):     at libcore.net.http.HttpsURLConnectionImpl$HttpsEngine.makeSslConnection(HttpsURLConnectionImpl.java:460)
03-21 12:58:04.055: W/System.err(7084):     at libcore.net.http.HttpsURLConnectionImpl$HttpsEngine.connect(HttpsURLConnectionImpl.java:432)
03-21 12:58:04.055: W/System.err(7084):     at libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java:282)
03-21 12:58:04.060: W/System.err(7084):     at libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:232)
03-21 12:58:04.065: W/System.err(7084):     at libcore.net.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:273)
03-21 12:58:04.065: W/System.err(7084):     at libcore.net.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:168)
03-21 12:58:04.070: W/System.err(7084):     at libcore.net.http.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:270)
03-21 12:58:04.070: W/System.err(7084): ...

码:

URL imageUrl = new URL(url);
HttpURLConnection c = (HttpURLConnection)imageUrl.openConnection();
InputStream in = c.getInputStream(); // Nullpointer exception on this line, c is definitely not null, I debugged

无法弄清楚为什么会引发NullPointerException.上面的网址确实可以在浏览器中使用.

解决方法:

对于它的价值,我在Android HTTP库中看到很多错误.从条码扫描器中,我可以看到大约3500万人员的堆栈跟踪,因此,我想我已经看到了其中的一切.这是我们在下面的应用程序中发现并吞下的所有怪异内容.我建议您将其作为平台错误来解决,并优雅地失败.

https://code.google.com/p/zxing/source/browse/trunk/android/src/com/google/zxing/client/android/HttpHelper.java

  private static int safelyConnect(String uri, HttpURLConnection connection) throws IOException {
    try {
      connection.connect();
    } catch (NullPointerException npe) {
      // this is an Android bug: http://code.google.com/p/android/issues/detail?id=16895
      Log.w(TAG, "Bad URI? " + uri);
      throw new IOException(npe.toString());
    } catch (IllegalArgumentException iae) {
      // Also seen this in the wild, not sure what to make of it. Probably a bad URL
      Log.w(TAG, "Bad URI? " + uri);
      throw new IOException(iae.toString());
    } catch (SecurityException se) {
      // due to bad VPN settings?
      Log.w(TAG, "Restricted URI? " + uri);
      throw new IOException(se.toString());
    } catch (indexoutofboundsexception ioobe) {
      // Another Android problem? https://groups.google.com/forum/?fromgroups#!topic/google-admob-ads-sdk/U-WfmYa9or0
      Log.w(TAG, "Bad URI? " + uri);
      throw new IOException(ioobe.toString());
    }
    try {
      return connection.getResponseCode();
    } catch (NullPointerException npe) {
      // this is maybe this Android bug: http://code.google.com/p/android/issues/detail?id=15554
      Log.w(TAG, "Bad URI? " + uri);
      throw new IOException(npe.toString());
    } catch (NumberFormatException nfe) {
      // Again seen this in the wild for bad header fields in the server response!
      Log.w(TAG, "Bad server status? " + uri);
      throw new IOException(nfe.toString());
    }
  }

android – achartengine toScreenPoint(double)总是返回nullPointerException

android – achartengine toScreenPoint(double)总是返回nullPointerException

每次调用此方法时,它都会返回nullpointerexception:

org.achartengine.chart.XYChart.toScreenPoint(XYChart.java:867)中的java.lang.NullPointerException

我看到图表的mScreenR为空

不使用此方法toScreenPoint(双)图表运行良好这是代码:

package com.insights.insights.gui;

import java.util.ArrayList;

import org.achartengine.ChartFactory;
import org.achartengine.GraphicalView;
import org.achartengine.chart.LineChart;
import org.achartengine.chart.PointStyle;
import org.achartengine.chart.XYChart;
import org.achartengine.model.XYMultipleSeriesDataset;
import org.achartengine.model.XYSeries;
import org.achartengine.renderer.XYMultipleSeriesRenderer;
import org.achartengine.renderer.XYSeriesRenderer;

import com.insights.insights.R;
import com.insights.insights.local.ApplicationsController;
import com.insights.insights.model.AppMetrics;
import com.insights.insights.model.Application;
import com.insights.insights.model.Applications;
import com.insights.insights.model.Day;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsoluteLayout;
import android.widget.LinearLayout;
import android.widget.Toast;

public class ChartFragment extends Fragment {

    private XYMultipleSeriesRenderer renderer;
    private XYMultipleSeriesDataset dataset;
    private GraphicalView graphicalView;
    private XYSeries firstSeries;
    private XYChart chart=null;

    private String apiKey;
    private ArrayList<Day> days;

    private View view;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        apiKey = getArguments().getString(getString(R.string.tabs_activity_api_key));
    }

    @Override
    public View onCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.chart_fragment,container,false);

        v.findViewById(R.idChartFragment.container).requestFocus();

        this.view = v;

        return v;
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);

        //      Obtaining data to plot
        Applications applications = ApplicationsController.getInstance(getActivity()).getApplications();
        ArrayList<Application> applicationArray = applications.getApplication();

        if (applicationArray != null && !applicationArray.isEmpty()) {
            for (int i = 0; i < applicationArray.size(); i++) {
                if (applicationArray.get(i).getApiKey().equals(apiKey)) {
                    ArrayList<AppMetrics> appMetrics = applicationArray.get(i).getAppMetrics();
                    for (int j = 0; j < appMetrics.size(); j++) {
                        if (appMetrics.get(j).getMetric().equals("Sessions")) {
                            days = appMetrics.get(j).getDay();
                            break;
                        }
                    }
                }
            }
        }

        // If there isn''t any item to plot and show a toast
        if (days == null) {
            Toast toast = Toast.makeText(getActivity(),R.string.chart_fragment_no_items,Toast.LENGTH_LONG);
            toast.show();
            return;
        }

        // Ploting the items
        dataset = getDataset(days);
        renderer = getRenderer();
        setRendererStyling(renderer);

        // add plot to the layout
        if (graphicalView == null) {
            LinearLayout layout = (LinearLayout) view.findViewById(R.idChartFragment.Chart);
            chart= new LineChart(dataset,renderer);
            graphicalView = new GraphicalView(getActivity(),chart);
            renderer.setSelectableBuffer(11);

            layout.addView(graphicalView);
        } else{
            graphicalView.repaint();
        }


        if(chart!=null&&firstSeries!=null){
            for(int i=0;i<firstSeries.getItemCount();i++){
                double x = firstSeries.getX(i);
                double y = firstSeries.getY(i);

                double[] screenPoint = chart.toScreenPoint(new double[] { x,y },0);

                Log.i("puntos",x + "," + y + " = "+" ("+screenPoint[0]+","+screenPoint[1]+")");
            }
        }
    }

    /**
     * Method for set the style of the plotter window and the string at the x
     * axis
     * 
     * @param mRenderer
     *            render to put style in
     * 
     * @param dataSetX
     *            string to set at x axis
     */
    private void setRendererStyling(XYMultipleSeriesRenderer mRenderer) {
        mRenderer.setApplyBackgroundColor(false);
        mRenderer.setMarginsColor(R.drawable.transperent_color);
        mRenderer.setMargins(new int[] { 0,0 });
        mRenderer.setShowAxes(false);
        mRenderer.setZoomButtonsVisible(false);
        mRenderer.setExternalZoomEnabled(false);
        mRenderer.setPointSize(20);
        mRenderer.setClickEnabled(false);
        mRenderer.setdisplayValues(false);
        mRenderer.setXLabels(0);
        mRenderer.setYLabels(0);
        mRenderer.setPanEnabled(false);
        mRenderer.setZoomEnabled(false);
        mRenderer.setShowLegend(false);

    }

    /**
     * Method to introduce the values of the y axis
     * 
     * @param dataSetY
     *            data to set at axis y
     * @return the data to set
     */
    private XYMultipleSeriesDataset getDataset(ArrayList<Day> days) {

        XYMultipleSeriesDataset dataset = new XYMultipleSeriesDataset();
        firstSeries = new XYSeries("");

        for (int i = 0; i < 12; i++) {

            int value = Integer.parseInt(days.get(days.size() - (13 - i)).getValue());
            firstSeries.add(i,value);

        }
        dataset.addSeries(firstSeries);
        return dataset;
    }

    /**
     * Method for set the style of the line you want to plot and create a new
     * renderer
     * 
     * @return the renderer
     */
    private XYMultipleSeriesRenderer getRenderer() {
        XYMultipleSeriesRenderer renderer = new XYMultipleSeriesRenderer();
        XYSeriesRenderer r = new XYSeriesRenderer();
        r.setColor(getResources().getColor(R.color.grey_number_label_background));
        r.setlinewidth(getResources().getInteger(R.integer.chart_fragment_line_width));
        // r.setdisplayChartValues(true);
        r.setPointStyle(PointStyle.POINT);
        r.setFillPoints(true);
        renderer.addSeriesRenderer(r);
        return renderer;
    }
}

这是布局文件:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+idChartFragment/container"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center_horizontal">

    <LinearLayout
        android:id="@+idChartFragment/Chart"
        android:layout_width="300dp"
        android:layout_height="300dp"
        android:orientation="horizontal"/>


    <AbsoluteLayout 
        android:id="@+idChartFragment/absolute"
        android:layout_width="300dp"
        android:layout_height="300dp"/>

</RelativeLayout>

第二编辑:

我想做这样的事情:

用我的代码我这样做:

这是我的代码:

package com.insights.insights.gui;

import java.util.ArrayList;
import java.util.List;

import org.achartengine.GraphicalView;
import org.achartengine.chart.ClickableArea;
import org.achartengine.chart.LineChart;
import org.achartengine.chart.PointStyle;
import org.achartengine.chart.XYChart;
import org.achartengine.model.SeriesSelection;
import org.achartengine.model.XYMultipleSeriesDataset;
import org.achartengine.model.XYSeries;
import org.achartengine.renderer.SimpleSeriesRenderer;
import org.achartengine.renderer.XYMultipleSeriesRenderer;
import org.achartengine.renderer.XYSeriesRenderer;

import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Typeface;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.text.Layout;
import android.util.AttributeSet;
import android.util.Log;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.view.ViewTreeObserver.OnGlobalLayoutListener;
import android.widget.AbsoluteLayout;
import android.widget.AbsoluteLayout.LayoutParams;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;

import com.google.android.maps.itemizedoverlay.OnFocuschangelistener;
import com.insights.insights.R;
import com.insights.insights.local.ApplicationsController;
import com.insights.insights.model.AppMetrics;
import com.insights.insights.model.Application;
import com.insights.insights.model.Applications;
import com.insights.insights.model.Day;

/**
 * 
 * @author Manuel Plazas Palacio
 * 
 */
public class ChartFragment extends Fragment {

    private XYMultipleSeriesRenderer renderer;
    private XYMultipleSeriesDataset dataset;
    private GraphicalView graphicalView;
    private XYSeries firstSeries;
    private XYChart chart = null;

    private AbsoluteLayout absoluteLayout;
    private ImageView point;
    private LinearLayout pointInfoConatiner;
    private TextView pointNumberText;
    private TextView pointNameText;
    private TextView pointDateText;

    private Typeface avenirHeavy;
    private Typeface avenirLight;

    private String apiKey;
    private String metricName;
    private ArrayList<Day> days;

    //  The max and the min values displayed
    private double max = 0;
    private double min = 0;

    private View view;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        apiKey = getArguments().getString(getString(R.string.tabs_activity_api_key));
        metricName = "Sessions";
    }

    @Override
    public View onCreateView(LayoutInflater inflater,false);

        v.findViewById(R.idChartFragment.container).requestFocus();

        this.view = v;

        absoluteLayout = (AbsoluteLayout) v.findViewById(R.idChartFragment.absolute);
        //      pointInfoConatiner = (LinearLayout) v.findViewById(R.idChartFragment.pointInfoContainer);
        //      pointNumberText = (TextView) v.findViewById(R.idChartFragment.pointNumberText);
        //      pointNameText = (TextView) v.findViewById(R.idChartFragment.pointNameText);
        //      pointDateText =  (TextView) v.findViewById(R.idChartFragment.pointDateText);
        //
        //      pointNameText.setText(metricName);

        //      Obtaining data to plot
        Applications applications = ApplicationsController.getInstance(getActivity()).getApplications();
        ArrayList<Application> applicationArray = applications.getApplication();

        if (applicationArray != null && !applicationArray.isEmpty()) {
            for (int i = 0; i < applicationArray.size(); i++) {
                if (applicationArray.get(i).getApiKey().equals(apiKey)) {
                    ArrayList<AppMetrics> appMetrics = applicationArray.get(i).getAppMetrics();
                    for (int j = 0; j < appMetrics.size(); j++) {
                        if (appMetrics.get(j).getMetric().equals(metricName)) {
                            days = appMetrics.get(j).getDay();
                            break;
                        }
                    }
                }
            }
        }

        // If there isn''t any item to plot and show a toast
        if (days == null) {
            Toast toast = Toast.makeText(getActivity(),Toast.LENGTH_LONG);
            toast.show();
        }

        // Ploting the items
        dataset = getDataset(days);
        renderer = getRenderer();
        setRendererStyling(renderer);

        // add plot to the layout
        if (graphicalView == null) {
            LinearLayout layout = (LinearLayout) view.findViewById(R.idChartFragment.Chart);
            chart = new LineChart(dataset,renderer);

            graphicalView = new GraphicalView(getActivity(),chart);
            renderer.setSelectableBuffer(11);

            layout.addView(graphicalView);
        } else {
            graphicalView.repaint();
        }

        return v;
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);

        avenirHeavy = Typeface.createFromAsset(getActivity().getAssets(),"fonts/Avenir Heavy.ttf");
        avenirLight = Typeface.createFromAsset(getActivity().getAssets(),"fonts/Avenir Light.ttf");

        graphicalView.setonClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {

                SeriesSelection seriesSelection = graphicalView.getCurrentSeriesAndPoint();
                double[] xy = graphicalView.toRealPoint(0);
                //creating the views
                createOnClickPointsView();

                if (seriesSelection != null) {

                    //                  debug
                    Log.d("Punto",seriesSelection.getXValue() + "," + seriesSelection.getValue());

                    double x = firstSeries.getX(seriesSelection.getPointIndex() + 1);
                    double y = firstSeries.getY(seriesSelection.getPointIndex() + 1);
                    double[] screenPoint = chart.toScreenPoint(new double[] { x,y });

                    //                  debug
                    Log.d("Chart point","Chart element in series index " + seriesSelection.getSeriesIndex() + " data point index "
                            + seriesSelection.getPointIndex() + " was clicked" + " closest point value X=" + seriesSelection.getXValue()
                            + ",Y=" + seriesSelection.getValue() + " clicked point value X=" + (float) xy[0] + ",Y=" + (float) xy[1]);
                    Log.d("Punto pantalla"," (" + screenPoint[0] + "," + screenPoint[1] + ")");

                    int value = Integer.parseInt(days.get((int) (days.size() - (13 - x))).getValue());
                    String date = days.get((int) (days.size() - (13 - x))).getDate();
                    pointNumberText.setText(value + "");
                    pointDateText.setText(date);

                    //                  drawing point info
                    absoluteLayout.addView(pointInfoConatiner,new LayoutParams(getResources().getDrawable(R.drawable.graficapin)
                            .getIntrinsicWidth(),getResources().getDrawable(R.drawable.graficapin).getIntrinsicHeight(),(int) (screenPoint[0] - (getResources().getDrawable(R.drawable.graficapin).getIntrinsicWidth() / 2)),(int) (screenPoint[1] - (getResources().getDrawable(R.drawable.graficapin).getIntrinsicHeight()))));

                    //                  drawing point clicked
                    absoluteLayout.addView(point,new LayoutParams(getResources().getDrawable(R.drawable.puntoon).getIntrinsicWidth(),getResources().getDrawable(R.drawable.puntoon).getIntrinsicHeight(),(int) (screenPoint[0] - (getResources()
                                    .getDrawable(R.drawable.puntoon).getIntrinsicWidth() / 2)),(int) (screenPoint[1] - ((getResources()
                                    .getDrawable(R.drawable.puntoon).getIntrinsicHeight()) / 4))));
                }
            }
        });

    }

    /**
     * Method for set the style of the plotter window and the string at the x
     * axis
     * 
     * @param mRenderer
     *            render to put style in
     * 
     * @param dataSetX
     *            string to set at x axis
     */
    private void setRendererStyling(XYMultipleSeriesRenderer mRenderer) {
        mRenderer.setApplyBackgroundColor(false);
        mRenderer.setMarginsColor(R.drawable.transperent_color);
        mRenderer.setMargins(new int[] { 0,0 });
        mRenderer.setShowAxes(false);
        mRenderer.setZoomButtonsVisible(false);
        mRenderer.setExternalZoomEnabled(false);
        mRenderer.setPointSize(getResources().getInteger(R.integer.chart_fragment_point_size));
        mRenderer.setClickEnabled(true);
        mRenderer.setdisplayValues(false);
        mRenderer.setXLabels(0);
        mRenderer.setYLabels(0);
        mRenderer.setPanEnabled(true);
        mRenderer.setZoomEnabled(false);
        mRenderer.setShowLegend(false);
        mRenderer.setYAxisMax(max + 10);
        mRenderer.setYAxisMin(min - 10);
    }

    /**
     * Method to introduce the values of the y axis
     * 
     * @param dataSetY
     *            data to set at axis y
     * @return the data to set
     */
    private XYMultipleSeriesDataset getDataset(ArrayList<Day> days) {

        XYMultipleSeriesDataset dataset = new XYMultipleSeriesDataset();
        firstSeries = new XYSeries("");

        for (int i = 0; i < 12; i++) {

            int value = Integer.parseInt(days.get(days.size() - (13 - i)).getValue());
            firstSeries.add(i,value);

        }
        dataset.addSeries(firstSeries);

        XYSeries secondSeries = new XYSeries("");
        for (int i = 1; i < 11; i++) {

            int value = Integer.parseInt(days.get(days.size() - (13 - i)).getValue());

            if (i == 1) {
                max = value;
                min = value;
            }

            if (value > max)
                max = value;
            if (value < min)
                min = value;

            secondSeries.add(i,value);

        }

        dataset.addSeries(secondSeries);
        return dataset;
    }

    /**
     * Method for set the style of the line you want to plot and create a new
     * renderer
     * 
     * @return the renderer
     */
    private XYMultipleSeriesRenderer getRenderer() {
        XYMultipleSeriesRenderer renderer = new XYMultipleSeriesRenderer();

        //First chart with the line
        XYSeriesRenderer r = new XYSeriesRenderer();
        r.setColor(getResources().getColor(R.color.grey_number_label_background));
        r.setlinewidth(getResources().getInteger(R.integer.chart_fragment_line_width));
        // r.setdisplayChartValues(true);
        r.setPointStyle(PointStyle.POINT);
        r.setFillPoints(true);
        renderer.addSeriesRenderer(r);

        //      Second chart with the points
        XYSeriesRenderer r1 = new XYSeriesRenderer();
        r1.setColor(getResources().getColor(R.color.purple_chart_points));
        r1.setlinewidth(0);
        r1.setFillPoints(true);
        r1.setPointStyle(PointStyle.CIRCLE);
        renderer.addSeriesRenderer(r1);

        return renderer;
    }

    public XYSeries getFirstSeries() {
        return firstSeries;
    }

    public void setFirstSeries(XYSeries firstSeries) {
        this.firstSeries = firstSeries;
    }

    public XYChart getChart() {
        return chart;
    }

    public void setChart(XYChart chart) {
        this.chart = chart;
    }

    /**
     * Method for create the views when clicking on a point of the chart
     */
    private void createOnClickPointsView() {
        //If the info is already visible 
        if (pointInfoConatiner != null)
            absoluteLayout.removeView(pointInfoConatiner);
        //              If the point is drawn
        if (point != null)
            absoluteLayout.removeView(point);

        pointInfoConatiner = new LinearLayout(getActivity());
        pointInfoConatiner.setBackgroundDrawable(getResources().getDrawable(R.drawable.graficapin));
        pointInfoConatiner.setorientation(LinearLayout.VERTICAL);
        pointInfoConatiner.setGravity(Gravity.CENTER_HORIZONTAL);

        LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,LinearLayout.LayoutParams.WRAP_CONTENT);
        layoutParams.setMargins(0,8,0);

        pointNumberText = new TextView(getActivity());
        pointNumberText.setTextSize(18);
        pointNumberText.setTextColor(getResources().getColor(R.color.purple_chart_points));
        pointNumberText.setTypeface(avenirHeavy);
        pointNumberText.setGravity(Gravity.CENTER);

        pointNameText = new TextView(getActivity());
        pointNameText.setTextSize(18);
        pointNameText.setTextColor(getResources().getColor(R.color.grey_users_label));
        pointNameText.setTypeface(avenirLight);
        pointNameText.setText(metricName);
        pointNameText.setGravity(Gravity.CENTER);

        pointDateText = new TextView(getActivity());
        pointDateText.setTextSize(11);
        pointDateText.setTextColor(getResources().getColor(R.color.grey_users_label));
        pointDateText.setTypeface(avenirHeavy);
        pointDateText.setGravity(Gravity.CENTER);

        pointInfoConatiner.addView(pointNumberText,layoutParams);
        layoutParams.setMargins(0,2,0);
        pointInfoConatiner.addView(pointNameText,1,layoutParams);
        pointInfoConatiner.addView(pointDateText,layoutParams);

        point = new ImageView(getActivity());
        point.setimageDrawable(getResources().getDrawable(R.drawable.puntoon));
    }
}

任何人都知道我怎么能:

1 – 退出底部边框

2 – 退出粉红色图表的线条

3 – 触摸点时图表不移动

4-当我询问屏幕点时为什么多次y值返回无穷大

解决方法

在旧版本的AChartEngine中曾经存在此错误.我建议你更新到1.1.0.

另请注意,调用方法时必须已显示图表.如果图表没有显示在屏幕上,那么就无法计算出来.

android – BufferedInputStream或FileInputStream IOException

android – BufferedInputStream或FileInputStream IOException

我刚刚发布了一个Android应用程序,它解析本地文件并对数据进行一些处理.
几天前,我的一位客户报告了一个错误,每次他试图处理他的文件时应用程序崩溃.

这是他发给我的错误日志:

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:818)
Caused by: java.lang.NullPointerException: lock == null
    at java.io.Reader.<init>(Reader.java:64)
    at java.io.InputStreamReader.<init>(InputStreamReader.java:120)

与此相关的代码是这样的:

// EDIT 1: Following greenapps comment I will put a more realistic version of this 
// method (The first version was invented because I wanted to be breaf)
public void selectFile()
{
    List<File> files = getDocsToParse();
    this.listview.setAdapter(this.myadapter);
    this.listview.setonItemClickListener(new OnItemClickListener()
    {
        ...
        @Override
        public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
        parseFile(files.get(position));
                }
        ...
    }
    this.myadapter.addFiles(files);
}

public static List<File> getDocsToParse() {
    File sdcard = Environment.getExternalStorageDirectory();
    File subdir = new File(sdcard, "MyAppFolder/Files/");
    // EDIT 2: I'm using  subdir.mkdirs(); because I want to 
    // create MyAppFolder/Files/ folders the first time the user use the app. 
    // Is this not correct? Should I create these folders any other way? 
    if (!subdir.exists()) {
        subdir.mkdirs();
    }
    File files[] = subdir.listFiles();
    List<File> filterFiles = new ArrayList<File>();
    for (int i = 0; i < files.length; i++) {
        File file = files[i];
        filterFiles.add(file);
    }
    return filterFiles;
}

public void parseFile(File filetoParse)
{
    long totalSize = 0;
    InputStream is = null;
    try {
            totalSize = filetoParse.length();
            is = new BufferedInputStream(new FileInputStream(filetoParse));
    } catch (IOException e) {
        e.printstacktrace();
    }
    BufferedReader reader = null;
    reader = new BufferedReader(new InputStreamReader(is, Charset.forName("UTF-8")));
    String line = "";
    StringTokenizer st = null;
    try {
        while ((line = reader.readLine()) != null) {
           // Here I parse the file
        }
    } catch (IOException e) {
        e.printstacktrace();
    }
}

崩溃的线是这一行:

reader = new BufferedReader(new InputStreamReader(is, Charset.forName("UTF-8")));

我知道这是因为“是”是空的,我应该抓住这个案例,以避免应用程序崩溃(我将在我的下一个版本中修复此问题).

编辑3:你是对的,greenapps,我会在使用之前检查是否为null,在其他情况下我不会使用它.

我知道“is”是null,因为有一个IOException这样做:

 totalSize = filetoParse.length();
    is = new BufferedInputStream(new FileInputStream(filetoParse));

编辑4:当然,如果这给了我一个IOEXception,我将不得不改变我的代码,使一个完全不同的东西.

我无法在Internet上找到原因,因此这两行代码可能会抛出IOException.

认为filetoParse没问题,或者至少不是null,因为我将这个“文件”列表传递给适配器,用files.get(i).getName()显示它们的文件名,并正确显示名称.

我必须补充说,要处理的文件非常大并且具有敏感的个人数据,因此用户无法将其发送给我,因此我可以使用它进行测试.

没有我的文件给我这个错误,没有有问题的文件,我很难跟踪问题所以我不得不猜测.知道什么原因会导致这个错误吗?

非常感谢和亲切的问候!

编辑5:遵循ctarabusi建议我已将我的parseFile方法更改为:

public void parseFile(File filetoParse)
{
    long totalSize = 0;
    InputStream is = null;
    try {
            totalSize = filetoParse.length();
            is = new BufferedInputStream(new FileInputStream(filetoParse));
            BufferedReader reader = null;
            reader = new BufferedReader(new InputStreamReader(is, Charset.forName("UTF-8")));
            String line = "";
            StringTokenizer st = null;
            while ((line = reader.readLine()) != null) {
               // Here I parse the file
            }
    } catch (IOException e) {
          Toast.makeText(getApplicationContext(), "Error parsing file", Toast.LENGTH_LONG).show();
        e.printstacktrace();
    } finally {
        if(is != null)
        {
            try
            {
                is.close();
            }
            catch (IOException e)
            {
                Log.e("", e.getMessage(), e);
            }
        }
    }
}

我的测试再次正常工作,但是用户告诉我他看到了“Error parsing file”消息,所以它还没有失败.

我还能检查什么?

解决方法:

可能是您的问题是您没有关闭输入流.
文件描述符和流是有限的资源,完成它们后释放它们非常重要.

通常在finally块中完成,如:

InputStream inputStream = null;
try 
{
    ... use your input stream
}
catch (IOException e)
{
    Log.e(TAG, e.getMessage(), e);
}
finally
{
    if (inputStream != null)
    {
        try
        {
            inputStream.close();
        }
        catch (IOException e)
        {
            Log.e(TAG, e.getMessage(), e);
        }
    }
}

android – Gradle Execution因任务extractReleaseAnnotations> java.lang.NullPointerException而失败

android – Gradle Execution因任务extractReleaseAnnotations> java.lang.NullPointerException而失败

我正在尝试设置一个依赖于其他两个库模块的 Android库模块.我们使用android.support.annotation框架在一些方法上添加注释.当我尝试构建aar时,这就是我得到的:

:hce_entry:extractReleaseAnnotations Failed
Error:Execution Failed for task '':hce_entry:extractReleaseAnnotations''.
> java.lang.NullPointerException (no error message)

我尝试使用–stacktrace选项获取更多信息来执行gradle构建,这是输出:

...
:hce_entry:extractReleaseAnnotations Failed

FAILURE: Build Failed with an exception.

What went wrong:
Execution Failed for task '':hce_entry:extractReleaseAnnotations''.
java.lang.NullPointerException (no error message)

Try:
Run with --info or --debug option to get more log output.

Exception is:
org.gradle.api.tasks.TaskExecutionException: Execution Failed for task '':hce_entry:extractReleaseAnnotations''.
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:69)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:46)
        at org.gradle.api.internal.tasks.execution.PostExecutionAnalysisTaskExecuter.execute(PostExecutionAnalysisTaskExecuter.java:35)
        at org.gradle.api.internal.tasks.execution.SkipUpToDateTaskExecuter.execute(SkipUpToDateTaskExecuter.java:64)
        at org.gradle.api.internal.tasks.execution.ValidatingTaskExecuter.execute(ValidatingTaskExecuter.java:58)
        at org.gradle.api.internal.tasks.execution.SkipEmptySourceFilesTaskExecuter.execute(SkipEmptySourceFilesTaskExecuter.java:52)
        at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:52)
        at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:53)
        at org.gradle.api.internal.tasks.execution.ExecuteAtMostOnceTaskExecuter.execute(ExecuteAtMostOnceTaskExecuter.java:43)
        at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker.execute(DefaultTaskGraphExecuter.java:203)
        at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker.execute(DefaultTaskGraphExecuter.java:185)
        at org.gradle.execution.taskgraph.AbstractTaskPlanExecutor$TaskExecutorWorker.processtask(AbstractTaskPlanExecutor.java:62)
        at org.gradle.execution.taskgraph.AbstractTaskPlanExecutor$TaskExecutorWorker.run(AbstractTaskPlanExecutor.java:50)
        at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor.process(DefaultTaskPlanExecutor.java:25)
        at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter.execute(DefaultTaskGraphExecuter.java:110)
        at org.gradle.execution.SelectedTaskExecutionAction.execute(SelectedTaskExecutionAction.java:37)
        at org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java:37)
        at org.gradle.execution.DefaultBuildExecuter.access$000(DefaultBuildExecuter.java:23)
        at org.gradle.execution.DefaultBuildExecuter$1.proceed(DefaultBuildExecuter.java:43)
        at org.gradle.execution.DryRunBuildExecutionAction.execute(DryRunBuildExecutionAction.java:32)
        at org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java:37)
        at org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java:30)
        at org.gradle.initialization.DefaultGradleLauncher$4.run(DefaultGradleLauncher.java:154)
        at org.gradle.internal.Factories$1.create(Factories.java:22)
        at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:90)
        at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:52)
        at org.gradle.initialization.DefaultGradleLauncher.dobuildStages(DefaultGradleLauncher.java:151)
        at org.gradle.initialization.DefaultGradleLauncher.access$200(DefaultGradleLauncher.java:32)
        at org.gradle.initialization.DefaultGradleLauncher$1.create(DefaultGradleLauncher.java:99)
        at org.gradle.initialization.DefaultGradleLauncher$1.create(DefaultGradleLauncher.java:93)
        at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:90)
        at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:62)
        at org.gradle.initialization.DefaultGradleLauncher.dobuild(DefaultGradleLauncher.java:93)
        at org.gradle.initialization.DefaultGradleLauncher.run(DefaultGradleLauncher.java:82)
        at org.gradle.launcher.exec.InProcessBuildActionExecuter$DefaultBuildController.run(InProcessBuildActionExecuter.java:94)
        at org.gradle.tooling.internal.provider.ExecuteBuildActionRunner.run(ExecuteBuildActionRunner.java:28)
        at org.gradle.launcher.exec.ChainingBuildActionRunner.run(ChainingBuildActionRunner.java:35)
        at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:43)
        at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:28)
        at org.gradle.launcher.exec.ContinuousBuildActionExecuter.execute(ContinuousBuildActionExecuter.java:77)
        at org.gradle.launcher.exec.ContinuousBuildActionExecuter.execute(ContinuousBuildActionExecuter.java:47)
        at org.gradle.launcher.exec.DaemonUsageSuggestingBuildActionExecuter.execute(DaemonUsageSuggestingBuildActionExecuter.java:51)
        at org.gradle.launcher.exec.DaemonUsageSuggestingBuildActionExecuter.execute(DaemonUsageSuggestingBuildActionExecuter.java:28)
        at org.gradle.launcher.cli.RunBuildAction.run(RunBuildAction.java:43)
        at org.gradle.internal.Actions$RunnableActionAdapter.execute(Actions.java:170)
        at org.gradle.launcher.cli.CommandLineActionFactory$ParseAndBuildAction.execute(CommandLineActionFactory.java:237)
        at org.gradle.launcher.cli.CommandLineActionFactory$ParseAndBuildAction.execute(CommandLineActionFactory.java:210)
        at org.gradle.launcher.cli.JavaRuntimeValidationAction.execute(JavaRuntimeValidationAction.java:35)
        at org.gradle.launcher.cli.JavaRuntimeValidationAction.execute(JavaRuntimeValidationAction.java:24)
        at org.gradle.launcher.cli.CommandLineActionFactory$WithLogging.execute(CommandLineActionFactory.java:206)
        at org.gradle.launcher.cli.CommandLineActionFactory$WithLogging.execute(CommandLineActionFactory.java:169)
        at org.gradle.launcher.cli.ExceptionReportingAction.execute(ExceptionReportingAction.java:33)
        at org.gradle.launcher.cli.ExceptionReportingAction.execute(ExceptionReportingAction.java:22)
        at org.gradle.launcher.Main.doAction(Main.java:33)
        at org.gradle.launcher.bootstrap.EntryPoint.run(EntryPoint.java:45)
        at org.gradle.launcher.bootstrap.ProcessBootstrap.runNoExit(ProcessBootstrap.java:54)
        at org.gradle.launcher.bootstrap.ProcessBootstrap.run(ProcessBootstrap.java:35)
        at org.gradle.launcher.GradleMain.main(GradleMain.java:23)
Caused by: java.lang.NullPointerException
        at com.android.build.gradle.tasks.annotations.Extractor$AnnotationData.appendExpression(Extractor.java:1603)
        at com.android.build.gradle.tasks.annotations.Extractor$AnnotationData.attributeString(Extractor.java:1592)
        at com.android.build.gradle.tasks.annotations.Extractor$AnnotationData.write(Extractor.java:1545)
        at com.android.build.gradle.tasks.annotations.Extractor$Item.write(Extractor.java:1792)
        at com.android.build.gradle.tasks.annotations.Extractor.writeExternalAnnotations(Extractor.java:769)
        at com.android.build.gradle.tasks.annotations.Extractor.export(Extractor.java:271)
        at com.android.build.gradle.tasks.annotations.Extractor$export$0.call(UnkNown Source)
        at com.android.build.gradle.tasks.ExtractAnnotations.compile(ExtractAnnotations.groovy:172)
        at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:75)
        at org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory$StandardTaskAction.doExecute(AnnotationProcessingTaskFactory.java:227)
        at org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory$StandardTaskAction.execute(AnnotationProcessingTaskFactory.java:220)
        at org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory$StandardTaskAction.execute(AnnotationProcessingTaskFactory.java:209)
        at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:585)
        at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:568)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(ExecuteActionsTaskExecuter.java:80)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:61)
        ... 57 more


BUILD Failed

这是我的build.gradle文件

apply plugin: ''com.android.library''

android {
    compileSdkVersion 19
    buildToolsversion ''19.1.0''

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile(''proguard-android.txt''),''proguard-rules.pro''
        }
        debug {
            debuggable true
            minifyEnabled false
        }
    }
}

dependencies {
    compile project('':core'')
    compile project('':lib'')
    compile ''com.android.support:support-v4:23.2.0''
}

有人可以给我任何建议吗?我有点迷茫,无法找到解决问题的方法.

先感谢您.

解决方法

我花了几天时间试图追踪这个问题并发现它归结为@IntDef(),我留空了.具体来说,我有@IntDef({})而不是@IntDef({CONSTANT1,CONSTANT2})

关于Apache POI-FileInputStream有效,文件对象失败NullPointerException的问题我们已经讲解完毕,感谢您的阅读,如果还想了解更多关于Android HttpUrlConnection getInputStream引发NullPointerException、android – achartengine toScreenPoint(double)总是返回nullPointerException、android – BufferedInputStream或FileInputStream IOException、android – Gradle Execution因任务extractReleaseAnnotations> java.lang.NullPointerException而失败等相关内容,可以在本站寻找。

本文标签: