Диалог сохранения файла Необработанное исключение

У меня есть некоторые проблемы с savefiledialog C#, у меня есть необработанное исключение типа System.NullReferenceException когда я отлаживаю, это код:

private void saveToolStripMenuItem_Click(object sender, System.EventArgs e)
        {
            switch (fileName)
            {
                case "":
                    {
                        saveFileDialog1 = new SaveFileDialog
                        {
                            Filter = @"Image files (*.bmp)|*.bmp|All files (*.*)|*.*",
                            FileName = "MyPicture.bmp"
                        };
                        if (saveFileDialog1.ShowDialog() != DialogResult.OK) return;
                        fileName = saveFileDialog1.FileName;
                        bitmap.Save(saveFileDialog1.FileName, ImageFormat.Bmp);
                    }
                    break;
                default:
                    {
                        bitmap.Save(fileName, ImageFormat.Bmp);
                    }
                    break;
            }

        }

вот моя декларация:

    private string fileName = "";
    private Bitmap bitmap;
    private Bitmap curBitmap;

вот мой полный код:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    //Bitmap


    //Graphics

    Graphics g;
    Pen p = new Pen(Color.Black, 8);
    Point start = new Point(0, 0);
    Point end = new Point(0, 0);
    bool drawing = false;

    //private int x1;
    //private int x2;
    //private int y1;
    //private int y2;
    //private int d1;
    //private int d2;
    private string fileName = "";
    private Bitmap bitmap;
    private Bitmap curBitmap;
    private Size fullSize;

    private void btnColorPicker_Click(object sender, EventArgs e)
    {
        //Get colors from colordialog
        DialogResult r = colorDialog1.ShowDialog();
        if (r == DialogResult.OK)
        {
            p.Color = colorDialog1.Color;
        }

    }


    private void PanelDrawing_MouseUp(object sender, MouseEventArgs e)
    {
        drawing = false;
    }

    private void PanelDrawing_MouseMove(object sender, MouseEventArgs e)
    {

        if (drawing && !earaser)
        {
            p.Width = PenSize.Value;
            p.Color = colorDialog1.Color;
            end = e.Location;
            g = PanelDrawing.CreateGraphics();
            g.DrawLine(p, start, end);
            PanelDrawing.Cursor = Cursors.HSplit;
        }
        else if (drawing && earaser)
        {
            end = e.Location;
            g = PanelDrawing.CreateGraphics();
            g.DrawLine(p, start, end);
            PanelDrawing.Cursor = Cursors.Cross;
        }
        else if (!drawing)
        {
            PanelDrawing.Cursor = Cursors.Default;
        }
        start = end;
    }

    private void PanelDrawing_MouseDown(object sender, MouseEventArgs e)
    {
        start = e.Location;
        if (e.Button == MouseButtons.Left)
        {
            drawing = true;
        }
    }

    private void PenSize_Scroll(object sender, EventArgs e)
    {
        p.Width = PenSize.Value;
        label1.Text = "" + PenSize.Value;
    }

    bool earaser = false;

    private void btnEaraser_Click(object sender, EventArgs e)
    {
        p.Color = Color.White;
        p.Width = 10;
        earaser = true;
    }

    private void btnBrush_Click(object sender, EventArgs e)
    {
        earaser = false;
    }

    private void btnClear_Click(object sender, EventArgs e)
    {
        g.Clear(PanelDrawing.BackColor);
    }

    private void saveToolStripMenuItem_Click(object sender, System.EventArgs e)
    {
        if (string.IsNullOrWhiteSpace(fileName))
        {
            saveFileDialog1 = new SaveFileDialog
            {
                Filter = @"Image files (*.bmp)|*.bmp|All files (*.*)|*.*",
                FileName = "MyPicture.bmp"
            };

            if (saveFileDialog1.ShowDialog() != DialogResult.OK)
                return;

            fileName = saveFileDialog1.FileName;
            bitmap.Save(saveFileDialog1.FileName, ImageFormat.Bmp);
        }
        else
        {
            bitmap.Save(fileName, ImageFormat.Bmp);
        }

    }
    private void Form1_Load(object sender, EventArgs e)
    {
        fullSize = SystemInformation.PrimaryMonitorMaximizedWindowSize;
        bitmap = new Bitmap(fullSize.Width, fullSize.Height);
        g = Graphics.FromImage(bitmap);
        g.SmoothingMode = SmoothingMode.AntiAlias;
        g.Clear(BackColor);
    }


}

4 ответа

Решение

Во-первых, я думаю, что переключатель не является хорошим способом обработки строк.

string.IsNullorEmpty а также string.IsNullorWhiteSpace может быть полезно для вас.

Можете ли вы отследить растровое изображение на вашей консоли? Вы уверены, что правильно объявили и инициализировали его в своем коде?

Это должно решить любую возможность:

private void saveToolStripMenuItem_Click(object sender,System.EventArgs e)
{
    var _Bitmap = new Bitmap(bitmap);
    //when we quit here we don't need this anymore; declaring it here helps with memory management
    if(_Bitmap == null)
        return;

    if(string.IsNullorEmpty(fileName)||string.IsNullorWhiteSpace(fileName)
    {
        Filter = @"Image files (*.bmp)|*.bmp|All files (*.*)|*.*",
        FileName = "MyPicture.bmp"
    }
    else
    {
        _Bitmap.Save(fileName,ImageFormat.Bmp);
    }
}

Вы назначаете растровое изображение на Form1_Load попробуйте сделать это отдельным методом и вызывать его, когда вам это нужно.

Возможно, она не перехватила переменную, если она пустая или пустая.

поэтому вместо использования оператора switch попробуйте сделать это в операторе If-Else.

Поскольку вы не указали "где" происходит исключение System.NullReferenceException. Я приму следующие 2 случая

1.fileName равно нулю. Если это так, добавьте еще 1 случай (как показано ниже) в ваш оператор switch, который принимает значение null.

switch (fileName)
        {
            case  "":
            case null:
                {
                    saveFileDialog1 = new SaveFileDialog
                    {
                        Filter = @"Image files (*.bmp)|*.bmp|All files (*.*)|*.*",
                        FileName = "MyPicture.bmp"
                    };
                    if (saveFileDialog1.ShowDialog() != DialogResult.OK) return;
                    fileName = saveFileDialog1.FileName;
                    bitmap.Save(saveFileDialog1.FileName, ImageFormat.Bmp);
                }
                break;
            default:
                {
                    bitmap.Save(fileName, ImageFormat.Bmp);
                }
                break;
        }

2. При сохранении вы используете тот же поток изображений, который использовался для его создания. Если это так, используйте новый растровый объект, как показано ниже.

 var newBitmap = new Bitmap(bitmap);
        switch (fileName)
        {

            case  "":
            case null:
                {
                    saveFileDialog1 = new SaveFileDialog
                    {
                        Filter = @"Image files (*.bmp)|*.bmp|All files (*.*)|*.*",
                        FileName = "MyPicture.bmp"
                    };
                    if (saveFileDialog1.ShowDialog() != DialogResult.OK) return;
                    fileName = saveFileDialog1.FileName;
                    newBitmap.Save(saveFileDialog1.FileName, ImageFormat.Bmp);
                }
                break;
            default:
                {
                    newBitmap.Save(fileName, ImageFormat.Bmp);
                }
                break;
        }

Это не место для использования оператора switch. Это гораздо проще переписать, как если бы:

private void saveToolStripMenuItem_Click(object sender, System.EventArgs e)
{
    if (string.IsNullOrWhiteSpace(fileName))
    {
        saveFileDialog1 = new SaveFileDialog
        {
            Filter = @"Image files (*.bmp)|*.bmp|All files (*.*)|*.*",
            FileName = "MyPicture.bmp"
        };

        if (saveFileDialog1.ShowDialog() != DialogResult.OK) 
            return;

        fileName = saveFileDialog1.FileName;
        bitmap.Save(saveFileDialog1.FileName, ImageFormat.Bmp);
    }
    else
    {
        bitmap.Save(fileName, ImageFormat.Bmp);
    }
}

Переключатель не подходит только потому, что он очень запутанный, и вы должны проверить несколько случаев (ноль, пустая строка, пробел). Вы можете заклинить код и заставить его работать, но это намного более надежно.

Не видя остальную часть вашего кода, невозможно сказать, bitmap будет нулевым или нет. Если его ноль, то вызов .Save приведет к NullReferenceException, Лучший способ узнать, почему он пуст, - узнать, как использовать отладчик. Установите точку останова на растровом изображении или там, где вы используете растровое изображение, чтобы понять, почему вы не пишете в него или вообще не создаете объект.

Другие вопросы по тегам