How do I use arguments sent to the program in a class other than the main class?

穿精又带淫゛_ 提交于 2020-12-13 03:12:33

问题


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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!