Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
i am getting a really weird error message in my code, it comes after i have selected a file, the error is :
Code:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at java.text.AttributedString.<init>(AttributedString.java:127)
at PrintText.print(PrintText.java:109)
at sun.print.RasterPrinterJob.printPage(RasterPrinterJob.java:1973)
at sun.print.RasterPrinterJob.print(RasterPrinterJob.java:1461)
at sun.print.RasterPrinterJob.print(RasterPrinterJob.java:1277)
at PrintText.printer(PrintText.java:98)
at PrintText$1.run(PrintText.java:52)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:251)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:721)
at java.awt.EventQueue.access$200(EventQueue.java:103)
at java.awt.EventQueue$3.run(EventQueue.java:682)
at java.awt.EventQueue$3.run(EventQueue.java:680)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:691)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:244)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:163)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:151)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:147)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:139)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:97)
The code :
Code:
import java.awt.*;
import java.awt.font.*;
import java.awt.geom.*;
import java.awt.print.*;
import java.text.*;
import java.io.*;
import javax.swing.*;
import java.util.List;
import java.util.ArrayList;
public class PrintText implements Printable {
private List<String> list;
// Below the code will allow the user to select a file and then print out the contents of the file
public static void main(String[] args) throws IOException {
new PrintText();
}
public PrintText() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
}
//selects the file
JFileChooser chooser = new JFileChooser();
chooser.showOpenDialog(null);
File file = chooser.getSelectedFile();
String filename = file.getName();
//System.out.println("You have selected: " + filename); testing to see if file seleected was right
String path = file.getAbsolutePath();
//Reads contents of file into terminal
//FileReader fr = new FileReader("filename");
// FileReader fr = new FileReader("D:/Documents/" + "filename"));
BufferedReader br = null;
try {
br = new BufferedReader(new FileReader(path));
List<String> list = new ArrayList<String>();
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
list.add(line);
}
printer();
} catch (IOException exp) {
exp.printStackTrace();
} finally {
try {
br.close();
} catch (Exception e) {
}
}
//fr.close();
}
});
}
//private static final String mText =
// "This is a test to see if this text will be printed "; //This works perfectly fine
//AttributedString mStyledText = new AttributedString(mText);
/**
* Print a single page containing some sample text.
*/
public void printer() {
/* Get the representation of the current printer and
* the current print job.
*/
PrinterJob printerJob = PrinterJob.getPrinterJob();
/* Build a book containing pairs of page painters (Printables)
* and PageFormats. This example has a single page containing
* text.
*/
Book book = new Book();
book.append(this, new PageFormat());
/* Set the object to be printed (the Book) into the PrinterJob.
* Doing this before bringing up the print dialog allows the
* print dialog to correctly display the page range to be printed
* and to dissallow any print settings not appropriate for the
* pages to be printed.
*/
printerJob.setPageable(book);
/* Show the print dialog to the user. This is an optional step
* and need not be done if the application wants to perform
* 'quiet' printing. If the user cancels the print dialog then false
* is returned. If true is returned we go ahead and print.
*/
boolean doPrint = printerJob.printDialog();
if (doPrint) {
try {
printerJob.print();
} catch (PrinterException exception) {
System.err.println("Printing error: " + exception);
}
}
}
/**
* Print a page of text.
*/
public int print(Graphics g, PageFormat format, int pageIndex) {
System.out.println("About to obtain an attributed string, list=" + list);
AttributedString mStyledText = new AttributedString(list);
// etc
/* We'll assume that Jav2D is available.
*/
Graphics2D g2d = (Graphics2D) g;
/* Move the origin from the corner of the Paper to the corner
* of the imageable area.
*/
g2d.translate(format.getImageableX(), format.getImageableY());
/* Set the text color.
*/
g2d.setPaint(Color.black);
/* Use a LineBreakMeasurer instance to break our text into
* lines that fit the imageable area of the page.
*/
Point2D.Float pen = new Point2D.Float();
AttributedCharacterIterator charIterator = mStyledText.getIterator();
LineBreakMeasurer measurer = new LineBreakMeasurer(charIterator, g2d.getFontRenderContext());
float wrappingWidth = (float) format.getImageableWidth();
while (measurer.getPosition() < charIterator.getEndIndex()) {
TextLayout layout = measurer.nextLayout(wrappingWidth);
pen.y += layout.getAscent();
float dx = layout.isLeftToRight() ? 0 : (wrappingWidth - layout.getAdvance());
layout.draw(g2d, pen.x + dx, pen.y);
pen.y += layout.getDescent() + layout.getLeading();
}
return Printable.PAGE_EXISTS;
}
}
Re: Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
Quote:
Code:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at java.text.AttributedString.<init>(AttributedString.java:127)
at PrintText.print(PrintText.java:109)
etc
You read the stack trace from the top down until you hit a line of your code. That's a good place to begin looking for the problem.
In this case it's line 109 which I assume is this one:
Code:
AttributedString mStyledText = new AttributedString(mText);
According to the API docs this constructor will throw a NullPointerException if you pass it a null string. It is easy to test if this is happening:
Code:
public int print(Graphics g, PageFormat format, int pageIndex) {
System.out.println("About to obtain an attributed string, mText=" + mText);
AttributedString mStyledText = new AttributedString(mText);
// etc
If it turns out that mText is, indeed, null you should go back through your code code to where you thought you had assigned it a non null value and figure out why that didn't happen.
Re: Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
Quote:
Originally Posted by
pbrockway2
You read the stack trace from the top down until you hit a line of your code. That's a good place to begin looking for the problem.
In this case it's line 109 which I assume is this one:
Code:
AttributedString mStyledText = new AttributedString(mText);
According to the
API docs this constructor will throw a NullPointerException if you pass it a null string. It is easy to test if this is happening:
Code:
public int print(Graphics g, PageFormat format, int pageIndex) {
System.out.println("About to obtain an attributed string, mText=" + mText);
AttributedString mStyledText = new AttributedString(mText);
// etc
If it turns out that
mText is, indeed, null you should go back through your code code to where you thought you had assigned it a non null value and figure out why that didn't happen.
You are correct, it turned out to be mText=null
i had thought that in the first part of my code :
Code:
BufferedReader br = null;
try {
br = new BufferedReader(new FileReader(path));
List<String> list = new ArrayList<String>();
while ((mText = br.readLine()) != null) {
//Displays the contents of the file in terminal
System.out.println(mText);
list.add(mText);
}
Would give mText the value of the contents of the file, is this doing this correct?,
Edit
mText is equal to null to end the loop, i have had to use the list and pass this, hopefully this will work
Re: Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
Yes, you are right: the text contents of the file end up in the list, not in mText. mText is a sort of "throw away" variable which is used to add a line to the list and, because of its temporary use, it might have been better to use a local variable in the method that did the reading. That way you would not have been tempted to use it elsewhere.
AttributedString will want some text (a String), not a list. So you are going to hve to put the pieces of the list back together again. It might have been better to use something like a StringBuffer to hold text rather than a list of strings. (Unless you actually want the list elsewhere - I haven't looked at the code that closely).
Re: Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
i have now updated the original post with my current code, i am now having one issue where i can not compile the code, it gives me an error no suitable constructor found for AttributedString(java.util.List<java.lang.String>)
i am told it is because i am passing the entire list of strings instead of a single string.
how can i change my code so it can compile and work ?
Re: Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
Did you understand what I said about reconstructing the text (as a String) from the list?
Code:
Make a string buffer
for each string in the list
add it to the string buffer
add a newline to the buffer
Obtain a String from the StringBuffer
Alternatively, don't use a list at all. Instead read the text into a string buffer.
Code:
BufferedReader br = null;
try {
br = new BufferedReader(new FileReader(path));
Create a string buffer
String line;
while ((line = br.readLine()) != null) {
Append string to string buffer
Append newline to string buffer
}
Obtain a String from the StringBuffer
printer(); // or whatever it takes to print the string
} catch (IOException exp) {
// etc
The StringBuffer API docs might help. And/or look in Oracle's or some other tutorial for examples of StringBuffer usage.
I have not really looked at the printing in detail, so I can't say more than that using a string buffer yields a string with more or less the content of the original file. So it's worth a try. There may be other problems with the printing, but it's a place to start.
[Edit] And, please, don't edit code once it's posted. Other people reading the thread will have an impossible time figuring out what is what. No-one will mind if you post updated versions of the code: in fact, it's more or less expected.
Re: Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
Ok thanks for all the help, the code is now working well with no errors :) thanks for all your guys help !
Re: Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException