问题
My program consists of 2 classes named Main
and LinkedList
and my program takes 3 arguments. For example, while I can access args[1]
in the Main class, I cannot access it in the LinkedList class. It says array access args[2]
will produce NullPointerException
and If I try to run it, it gaves me NullPointerException
. How can I solve this?
Here is my code:
Main Cass:
import java.io.*;
import java.util.Scanner; // Import the Scanner class to read text files
public class Main {
public static void main(String[] args) throws IOException {
int i = 0;
/* Start with the empty list. */
LinkedList list = new LinkedList(args);
int id1 = 0,year1 = 0,count1 = 0,price1 = 0;
String name1 = "",singer1 = "";
//The contents of data.txt have been loaded into the program.
try {
Scanner scan = new Scanner(new File(args[1]));
while (scan.hasNextLine()) {
String data = scan.nextLine();
String[] readedData = data.split(";");
LinkedList.insert(list,id1 = Integer.parseInt(readedData[0]),price1 = Integer.parseInt(readedData[1]),name1 = readedData[2],singer1 = readedData[3],year1 = Integer.parseInt(readedData[4]),count1 = Integer.parseInt(readedData[5]));
}
scan.close();
} catch (FileNotFoundException e) {
System.out.println("An error occurred.");
e.printStackTrace();
}
//The object required to write to the file has been created.
//FileWriter myWriter = new FileWriter(args[2]);
PrintStream output = new PrintStream(args[2]);
//The input.txt file has started to be read.
try {
Scanner scan = new Scanner(new File(args[0]));
while (scan.hasNextLine()) {
String data = scan.nextLine();
// First, split on whitespace
//String[] parts = data.split("(?<!\"\\w\")\\s+(?!\\w+\")"); //Alternate Solution
String[] parts = data.split("\\s(?=\\w+:)");
String[] parts1 = data.split("(?<!\"\\w\")\\s+(?!\\w+\")");
String command1 = parts1[0];
// The first element in the array is the command
String command = parts[0];
// Split the remaining elements on ':'
String[] keyVal;
String key = " ";
String value= " ";
for (i = 1; i < parts.length; i++) {
keyVal = parts[i].split(":");
if (keyVal.length == 2) {
key = keyVal[0];
value = keyVal[1];
switch (key) {
case "id" -> id1 = Integer.parseInt(value);
case "name" -> name1 = value.substring(1, value.length() - 1);
case "singer" -> singer1 = value.substring(1, value.length() - 1);
case "year" -> year1 = Integer.parseInt(value);
case "count" -> count1 = Integer.parseInt(value);
case "price" -> price1 = Integer.parseInt(value);
}
}
}
switch (command1) {
case "Add" -> {
LinkedList.insert(list, id1, price1, name1, singer1, year1, count1); //DONE!
output.print("New CD added id: "+id1+" name: "+name1);
output.println();
}
case "Search" -> {
output.print("List:\n");
String[] key1 = command.split(" ");
String SearchKey = key1[1];
SearchKey = SearchKey.substring(1, SearchKey.length() - 1);
LinkedList.searchAndFind(list,SearchKey);
}
case "Remove" -> {
LinkedList.deleteNode(list,LinkedList.searchPosition(list,id1)); //DONE!
output.print("CD removed id: "+id1);
output.println();
}
case "List" -> {
output.print("List:\n");
LinkedList.printList(list); //DONE!
}
case "Edit" -> {
output.print("Edit CD id: "+id1);
output.println();
switch (key) {
case "singer" -> LinkedList.editSinger(list, id1, singer1);
case "name" -> LinkedList.editName(list, id1, name1);
case "year" -> LinkedList.editYear(list, id1, year1); //DONE!
case "count" -> LinkedList.editCount(list, id1, count1);
case "price" -> LinkedList.editPrice(list, id1, price1);
}
}
case ("Sell") -> {
LinkedList.sell(list,id1);
output.print("CD Sold. ID: "+id1); //DONE!
output.println();
}
case "Quit" -> {
output.print("Quit");
output.println();
output.print("Cash :"+LinkedList.cash);
output.println();
}
}
}
output.close();
scan.close();
} catch (FileNotFoundException e) {
System.out.println("An error occurred.");
e.printStackTrace();
}
//LinkedList.printList(list);
}
}
LinkedList Class:
import java.io.IOException;
import java.io.PrintStream;
public class LinkedList {
Node head; // head of list
private String[] args;
public LinkedList(String[] args) throws IOException {
this.args = args;
}
PrintStream output = new PrintStream(args[2]); //=====> PROBLEM İS HERE!
static class Node {
int id;
int year;
int count;
int price;
String name;
String singer;
Node next;
// Constructor
Node(int i, int p, String n, String s, int y, int c) {
id = i;
year = y;
count = c;
price = p;
name = n;
singer = s;
next = null;
}
}
public static LinkedList insert(LinkedList list, int i,int p, String n, String s, int y,int c)
{
// Create a new node with given data
Node new_node = new Node(i,p,n,s,y,c);
new_node.next = null;
// If the Linked List is empty,
// then make the new node as head
if (list.head == null) {
list.head = new_node;
}
else {
// Else traverse till the last node
// and insert the new_node there
Node last = list.head;
while (last.next != null) {
last = last.next;
}
// Insert the new_node at last node
last.next = new_node;
}
// Return the list by head
return list;
}
public static void printList(LinkedList list)
{
Node currNode = list.head;
System.out.printf("%s %10s %30s %25s %15s %10s", "ID", "Price", "Name", "Singer", "Year", "Count");
System.out.println("\n-------------------------------------------------------------------------------------------------");
// Traverse through the LinkedList
while (currNode != null) {
// Print the data at current node
System.out.printf("%s %10s %30s %25s %15s %10s", currNode.id, currNode.price, currNode.name, currNode.singer, currNode.year, currNode.count);
// Go to next node
currNode = currNode.next;
System.out.println();
}
System.out.println();
}
public static void deleteNode(LinkedList list ,int position)
{
// If linked list is empty
if (list.head == null)
return;
// Store head node
Node temp = list.head;
// If head needs to be removed
if (position == 0)
{
list.head = temp.next; // Change head
return;
}
// Find previous node of the node to be deleted
for (int i=0; temp!=null && i<position-1; i++)
temp = temp.next;
// If position is more than number of nodes
if (temp == null || temp.next == null)
return;
// Node temp->next is the node to be deleted
// Store pointer to the next of node to be deleted
Node next = temp.next.next;
temp.next = next; // Unlink the deleted node from list
}
static int search = 0;
static int cash = 0;
public static int searchPosition(LinkedList list, int x)
{
search = 0;
Node current = list.head; //Initialize current
while (current != null)
{
if (current.id == x){
break;
}
current = current.next;
search++;
}
return search;
}
public static int sell(LinkedList list, int x)
{
Node current = list.head; //Initialize current
while (current != null)
{
if (current.id == x){
cash = cash + current.price;
break;
}
current = current.next;
}
return cash;
}
public static void editName(LinkedList list, int x, String a)
{
Node current = list.head; //Initialize current
while (current != null)
{
if (current.id == x){
current.name = a;
System.out.printf("%s %10s %30s %25s %15s %10s", "ID", "Price", "Name", "Singer", "Year", "Count");
System.out.println("\n-------------------------------------------------------------------------------------------------");
System.out.printf("%s %10s %30s %25s %15s %10s", current.id, current.price, current.name, current.singer, current.year, current.count);
break;
}
current = current.next;
}
}
public static void editSinger(LinkedList list, int x, String a)
{
Node current = list.head; //Initialize current
while (current != null)
{
if (current.id == x){
current.singer = a;
System.out.printf("%s %10s %30s %25s %15s %10s", "ID", "Price", "Name", "Singer", "Year", "Count");
System.out.println("\n-------------------------------------------------------------------------------------------------");
System.out.printf("%s %10s %30s %25s %15s %10s", current.id, current.price, current.name, current.singer, current.year, current.count);
break;
}
current = current.next;
}
}
public static void editYear(LinkedList list, int x, int a)
{
Node current = list.head; //Initialize current
while (current != null)
{
if (current.id == x){
current.year = a;
System.out.printf("%s %10s %30s %25s %15s %10s", "ID", "Price", "Name", "Singer", "Year", "Count");
System.out.println("\n-------------------------------------------------------------------------------------------------");
System.out.printf("%s %10s %30s %25s %15s %10s", current.id, current.price, current.name, current.singer, current.year, current.count);
break;
}
current = current.next;
}
}
public static void editCount(LinkedList list, int x, int a)
{
Node current = list.head; //Initialize current
while (current != null)
{
if (current.id == x){
current.count = a;
System.out.printf("%s %10s %30s %25s %15s %10s", "ID", "Price", "Name", "Singer", "Year", "Count");
System.out.println("\n-------------------------------------------------------------------------------------------------");
System.out.printf("%s %10s %30s %25s %15s %10s", current.id, current.price, current.name, current.singer, current.year, current.count);
break;
}
current = current.next;
}
}
public static void editPrice(LinkedList list, int x, int a)
{
Node current = list.head; //Initialize current
while (current != null)
{
if (current.id == x){
current.price = a;
System.out.printf("%s %10s %30s %25s %15s %10s", "ID", "Price", "Name", "Singer", "Year", "Count");
System.out.println("\n-------------------------------------------------------------------------------------------------");
System.out.printf("%s %10s %30s %25s %15s %10s", current.id, current.price, current.name, current.singer, current.year, current.count);
break;
}
current = current.next;
}
}
public static void searchAndFind(LinkedList list, String a)
{
Node current = list.head; //Initialize current
System.out.printf("%s %10s %30s %25s %15s %10s", "ID", "Price", "Name", "Singer", "Year", "Count");
System.out.println("\n-------------------------------------------------------------------------------------------------");
while (current != null)
{
if (current.name.contains(a)){
System.out.printf("%s %10s %30s %25s %15s %10s", current.id, current.price, current.name, current.singer, current.year, current.count);
System.out.println();
}
current = current.next;
}
}
}
回答1:
The problem is, the String array args
is part of the main method of Main.java.
How can I create an object to write to files in my LinkedList class
What you can do, is to change the constructor of LinkedList.java to ...
public LinkedList(String[] args) throws IOException {
this.args = args;
}
... and use it in your class, but we will use an PrintStream, because it also has all of the methods of course. printf()
, println()
, and so on ...
import java.io.PrintWriter;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.io.IOException;
import java.util.MissingFormatArgumentException;
public class LinkedList {
Node head; // head of list
private String[] args;
public LinkedList(String[] args) throws IOException {
this.args = args;
}
static class Node {
int id;
int year;
int count;
int price;
String name;
String singer;
Node next;
// Constructor
Node(int i, int p, String n, String s, int y, int c) {
id = i;
year = y;
count = c;
price = p;
name = n;
singer = s;
next = null;
}
}
public static LinkedList insert(LinkedList list, int i,int p, String n, String s, int y,int c)
{
// Create a new node with given data
Node new_node = new Node(i,p,n,s,y,c);
new_node.next = null;
// If the Linked List is empty,
// then make the new node as head
if (list.head == null) {
list.head = new_node;
}
else {
// Else traverse till the last node
// and insert the new_node there
Node last = list.head;
while (last.next != null) {
last = last.next;
}
// Insert the new_node at last node
last.next = new_node;
}
// Return the list by head
return list;
}
public static void printList(LinkedList list)
{
PrintWriter writer = new PrintWriter(Files.newBufferedWriter(Paths.get(args[2])));
Node currNode = list.head;
writer.printf("%s %10s %30s %25s %15s %10s", "ID", "Price", "Name", "Singer", "Year", "Count");
writer.println("\n-------------------------------------------------------------------------------------------------");
// Traverse through the LinkedList
while (currNode != null) {
// Print the data at current node
writer.printf("%s %10s %30s %25s %15s %10s", currNode.id, currNode.price, currNode.name, currNode.singer, currNode.year, currNode.count);
// Go to next node
currNode = currNode.next;
writer.println();
}
writer.println();
}
public static void deleteNode(LinkedList list ,int position)
{
// If linked list is empty
if (list.head == null)
return;
// Store head node
Node temp = list.head;
// If head needs to be removed
if (position == 0)
{
list.head = temp.next; // Change head
return;
}
// Find previous node of the node to be deleted
for (int i=0; temp!=null && i<position-1; i++)
temp = temp.next;
// If position is more than number of nodes
if (temp == null || temp.next == null)
return;
// Node temp->next is the node to be deleted
// Store pointer to the next of node to be deleted
Node next = temp.next.next;
temp.next = next; // Unlink the deleted node from list
}
static int search = 0;
static int cash = 0;
public static int searchPosition(LinkedList list, int x)
{
search = 0;
Node current = list.head; //Initialize current
while (current != null)
{
if (current.id == x){
break;
}
current = current.next;
search++;
}
return search;
}
public static int sell(LinkedList list, int x)
{
Node current = list.head; //Initialize current
while (current != null)
{
if (current.id == x){
cash = cash + current.price;
break;
}
current = current.next;
}
return cash;
}
public static void editName(LinkedList list, int x, String a)
{
Node current = list.head; //Initialize current
while (current != null)
{
if (current.id == x){
current.name = a;
break;
}
current = current.next;
}
}
public static void editSinger(LinkedList list, int x, String a)
{
Node current = list.head; //Initialize current
while (current != null)
{
if (current.id == x){
current.singer = a;
break;
}
current = current.next;
}
}
public static void editYear(LinkedList list, int x, int a)
{
Node current = list.head; //Initialize current
while (current != null)
{
if (current.id == x){
current.year = a;
break;
}
current = current.next;
}
}
public static void editCount(LinkedList list, int x, int a)
{
Node current = list.head; //Initialize current
while (current != null)
{
if (current.id == x){
current.count = a;
break;
}
current = current.next;
}
}
public static void editPrice(LinkedList list, int x, int a)
{
Node current = list.head; //Initialize current
while (current != null)
{
if (current.id == x){
current.price = a;
break;
}
current = current.next;
}
}
public static void searchAndFind(LinkedList list, String a)
{
Node current = list.head; //Initialize current
PrintWriter writer = new PrintWriter(Files.newBufferedWriter(Paths.get(args[2])));
writer.printf("%s %10s %30s %25s %15s %10s", "ID", "Price", "Name", "Singer", "Year", "Count");
writer.println("\n-------------------------------------------------------------------------------------------------");
while (current != null)
{
if (current.name.contains(a)){
System.out.printf("%s %10s %30s %25s %15s %10s", current.id, current.price, current.name, current.singer, current.year, current.count);
System.out.println();
}
current = current.next;
}
}
}
And your main then:
import java.io.File; // Import the File class
import java.io.FileNotFoundException; // Import this class to handle errors
import java.util.Scanner; // Import the Scanner class to read text files
import java.io.FileWriter; // Import the FileWriter class
import java.io.IOException; // Import the IOException class to handle errors
public class Main {
public static void main(String[] args) throws IOException {
int i = 0;
/* Start with the empty list. */
LinkedList list = new LinkedList(args);
int id1 = 0,year1 = 0,count1 = 0,price1 = 0;
String name1 = "",singer1 = "";
//The contents of data.txt have been loaded into the program.
try {
Scanner scan = new Scanner(new File(args[1]));
while (scan.hasNextLine()) {
String data = scan.nextLine();
String[] readedData = data.split(";");
LinkedList.insert(list,id1 = Integer.parseInt(readedData[0]),price1 = Integer.parseInt(readedData[1]),name1 = readedData[2],singer1 = readedData[3],year1 = Integer.parseInt(readedData[4]),count1 = Integer.parseInt(readedData[5]));
}
scan.close();
} catch (FileNotFoundException e) {
System.out.println("An error occurred.");
e.printStackTrace();
}
//The object required to write to the file has been created.
FileWriter myWriter = new FileWriter(args[2]);
//The input.txt file has started to be read.
try {
Scanner scan = new Scanner(new File(args[0]));
while (scan.hasNextLine()) {
String data = scan.nextLine();
// First, split on whitespace
//String[] parts = data.split("(?<!\"\\w\")\\s+(?!\\w+\")"); //Alternate Solution
String[] parts = data.split("\\s(?=\\w+:)");
String[] parts1 = data.split("(?<!\"\\w\")\\s+(?!\\w+\")");
String command1 = parts1[0];
// The first element in the array is the command
String command = parts[0];
// Split the remaining elements on ':'
String[] keyVal;
String key = " ";
String value= " ";
for (i = 1; i < parts.length; i++) {
keyVal = parts[i].split(":");
if (keyVal.length == 2) {
key = keyVal[0];
value = keyVal[1];
switch (key) {
case "id" -> id1 = Integer.parseInt(value);
case "name" -> name1 = value.substring(1, value.length() - 1);
case "singer" -> singer1 = value.substring(1, value.length() - 1);
case "year" -> year1 = Integer.parseInt(value);
case "count" -> count1 = Integer.parseInt(value);
case "price" -> price1 = Integer.parseInt(value);
}
}
}
switch (command1) {
case "Add" -> {
LinkedList.insert(list, id1, price1, name1, singer1, year1, count1); //DONE!
myWriter.write("New CD added id: "+id1+" name: "+name1);
}
case "Search" -> {
String[] key1 = command.split(" ");
String SearchKey = key1[1];
SearchKey = SearchKey.substring(1, SearchKey.length() - 1);
LinkedList.searchAndFind(list,SearchKey);
}
case "Remove" -> {
LinkedList.deleteNode(list,LinkedList.searchPosition(list,id1)); //DONE!
myWriter.write("CD removed id: "+id1);
}
case "List" -> {
LinkedList.printList(list); //DONE!
}
case "Edit" -> {
switch (key) {
case "singer" -> LinkedList.editSinger(list, id1, singer1);
case "name" -> LinkedList.editName(list, id1, name1);
case "year" -> LinkedList.editYear(list, id1, year1); //DONE!
case "count" -> LinkedList.editCount(list, id1, count1);
case "price" -> LinkedList.editPrice(list, id1, price1);
}
}
case ("Sell") -> {
LinkedList.sell(list,id1);
myWriter.write("CD Sold. ID: "+id1); //DONE!
}
case "Quit" -> {
myWriter.write("Quit");
myWriter.write(LinkedList.cash);
}
}
}
myWriter.close();
scan.close();
} catch (FileNotFoundException e) {
System.out.println("An error occurred.");
e.printStackTrace();
}
//LinkedList.printList(list);
}
}
来源:https://stackoverflow.com/questions/64647919/how-do-i-use-arguments-sent-to-the-program-in-a-class-other-than-the-main-class